我可以使用以下命令查看当前的search_path

show search_path ;


我可以使用以下命令为当前会话设置search_path

set search_path = "$user", public, postgis;


我也可以通过以下方式为给定数据库永久设置search_path

alter database mydb set search_path = "$user", public, postgis ;


我可以为给定角色(用户)永久设置search_path使用:

alter role johnny set search_path = "$user", public, postgis ;


但是我想知道如何在更改数据库和角色设置之前(相对于search_path)确定什么?

#1 楼

您可以在目录表pg_db_role_setting中找到角色和数据库的配置设置。

此查询检索给定角色或数据库的任何设置:

SELECT r.rolname, d.datname, rs.setconfig
FROM   pg_db_role_setting rs
LEFT   JOIN pg_roles      r ON r.oid = rs.setrole
LEFT   JOIN pg_database   d ON d.oid = rs.setdatabase
WHERE  r.rolname = 'myrole' OR d.datname = 'mydb';


如果未设置任何内容,则下一个较低的实例将确定search_path的默认状态(在这种情况下为postgresql.conf)或服务器启动时的命令行选项。相关:


search_path如何影响标识符解析和“当前模式”

取消设置角色或数据库的任何设置-特别是search_path例如:

ALTER ROLE myrole RESET search_path;


或:

ALTER DATABASE mydb RESET search_path;


或:

ALTER ROLE myrole in DATABASE mydb RESET search_path;


切勿手动操作系统目录(pg_catalog.*)中的数据。按照ALTER ROLEALTER DATABASE的手册中的说明使用DDL命令。
实质上,RESET命令从pg_db_role_setting中删除一行,使基本设置再次生效。我不会说那令人费解的。

评论


哇。我没有想到这会令人费解。您将如何取消给定的数据库和角色设置?执行更改角色myrole后,设置search_path =“ $ user”,public,postgis;我注意到pg_roles.rolconfig(对应于我的角色)的值为{“ search_path = \” $ user \“,public,postgis”}。另外,从pg_db_role_setting中选择*;现在显示了另一行。在执行alter database mydb之后,设置search_path =“ $ user”,public,postgis;我在pg_db_role_setting中的select *中看到了相应的行; -最后,我不确定如何“撤消”这些更改。

–user664833
2014年1月3日,17:26

@ user664833:我添加了要取消设置的说明。

–欧文·布兰德斯特(Erwin Brandstetter)
2014年1月3日17:35

#2 楼

数据库和角色的永久设置都存储在pg_db_role_settings系统集群范围的表中。

仅传递给ALTER USERALTER DATABASE的设置存在于此表中。要获得除以下命令之外配置的值:



任何更改之前的设置值,包括在群集级别(通过全局配置postgresql.conf) )可以使用以下命令从数据库中查询:

 SELECT boot_val FROM pg_settings WHERE name='search_path';



会话中任何更改之前的设置值(通过SET命令)可以为从数据库中查询以下内容:

 SELECT reset_val FROM pg_settings WHERE name='search_path';


如果在postgresql.conf中设置了非默认值,则独立于当前会话在SQL中获取该值并不容易。 pg_settings.boot_val不会执行此操作,因为它会忽略配置文件中的更改,而pg_settings.reset_val也不会执行任何操作,因为它受可能通过ALTER USER/ALTER DATABASE设置的数据库/用户设置的影响。 DBA获得值的最简单方法是在postgresql.conf中查找它。否则,请参阅
将search_path重置为全局集群默认值,其中详细介绍了此主题。


评论


boot_val实际上不是内置的出厂默认值,不是postgresql.conf中的设置吗?

–欧文·布兰德斯特(Erwin Brandstetter)
16年7月30日在0:23

@Erwin:是的。可能需要查看reset_val而不是boot_val。

–丹尼尔·韦里特(DanielVérité)
16年8月1日在11:15

嗯,数据库或角色设置会覆盖reset_val中的值。我偶然发现了这个研究最近的问题:dba.stackexchange.com/questions/145280/…

–欧文·布兰德斯特(Erwin Brandstetter)
16年8月1日在12:35

@Erwin:ISTM在大多数情况下,从postgresql.conf获取值很可能是XY问题。无论如何,我编辑了答案以链接到较新的问题并进行了扩展。

–丹尼尔·韦里特(DanielVérité)
16年8月1日在13:47

#3 楼

select * from pg_user;


适用于postgres和Redshift。与以前的依赖pg_db_role_setting的答案相比,这似乎太简单了,但是useconfig列将包含用户配置列表,包括search_path,格式设置为列表。
要有选择性,请执行以下操作:

rs.db.batarang.com cooldb:cooldude =#> select usename
                                              , useconfig 
                                       from   pg_user
                                       where  usename = 'cooldude';
┌────────────┬─────────────────────────────────────────────────────┐
│  usename   │                      useconfig                      │
├────────────┼─────────────────────────────────────────────────────┤
│ cooldude   │ {"search_path=dirt, test, \"$user\", public, prod"} │
└────────────┴─────────────────────────────────────────────────────┘


我认为此用户表包含集群中的所有用户,而不仅仅是特定的db,但我没有验证那

评论


角色与用户不完全相同。 ;)

–维克
18年8月12日在19:56

维克您能详细说明吗? Postgres文档简洁明了,似乎在说用户和角色不再是截然不同的概念,但是我不是DBA,并且希望获得更多反馈。 postgresql.org/docs/current/static/user-manag.html

–梅林
18年8月14日在17:18

任何“角色”都可以充当用户,组或两者。但是,暗示用户具有其他区别。查看目录,我们看到视图pg_role和pg_user都引用了表pg_authid,但是对于用户来说是谓词rolcanlogin。 “用户”可以登录到您的数据库,并且通常“角色”定义用户继承的授权集。

–维克
18年8月14日在17:36

嗨,维克(Vic),我知道这个帖子很旧,但是希望在这里得到一些帮助。我正在使用搜索路径来为特定角色(组)设置默认架构。我知道我可以在用户级别进行设置,但是由于我们有一组用户,因此我们创建了角色,希望所有这些用户默认使用特定的架构。角色rds_inv是创建的角色,并且svc_inv被授予此角色。因此,如果我设置以下内容,则权限不会继承给用户svc_inv。我想知道你能不能帮我?仅在设置为用户而不是角色时有效。将ROLE rds_inv SET search_path更改为“ flow”; >不起作用

– DBAuser
20 Nov 24在22:44