给定数据库和用户的search_path是什么?


43

我可以看到当前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)之前如何确定它们?

Answers:


36

您可以在目录表中找到角色和数据库的配置设置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在此特定示例中:

ALTER ROLE myrole RESET search_path;

要么:

ALTER DATABASE mydb RESET search_path;

要么:

ALTER ROLE myrole in DATABASE mydb RESET search_path;

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


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

@ user664833:我添加了要取消设置的说明。
Erwin Brandstetter,2014年

6

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

仅存在更改的设置。如果从未为数据库或角色修改过搜索路径,那么我想可以假设它是"$user",public

  • 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

@Erwin:是的。可能要看一眼reset_val而不是boot_val
DanielVérité16年

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

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

3
select * from pg_user;

适用于postgres和Redshift。与之前的依靠的答案相比,这似乎太简单了pg_db_role_setting,但此useconfig列将包含一个用户配置列表,包括search_path,格式为列表。

pg_user Postgres文档在这里

更具选择性:

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"} 
└────────────┴─────────────────────────────────────────────────────┘

我认为此用户表包含集群中的所有用户,而不仅仅是特定的数据库-但我没有对此进行验证。


角色与用户不完全相同。;)
维克(Vic

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

2
任何“角色”都可以充当用户,组或两者。但是,暗示用户具有其他区别。查看目录,我们看到视图pg_role和pg_user都引用了表pg_authid,但是对于用户来说是谓词rolcanlogin。“用户”可以登录到您的数据库,并且通常“角色”定义用户继承的授权集。
维克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.