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

use*_*833 73 postgresql configuration

我可以看到电流search_path

show search_path ;
Run Code Online (Sandbox Code Playgroud)

我可以search_path当前会话设置:

set search_path = "$user", public, postgis;
Run Code Online (Sandbox Code Playgroud)

同样,我可以search_path为给定的数据库永久设置:

alter database mydb set search_path = "$user", public, postgis ;
Run Code Online (Sandbox Code Playgroud)

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

alter role johnny set search_path = "$user", public, postgis ;
Run Code Online (Sandbox Code Playgroud)

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

Erw*_*ter 55

您可以在目录表中找到角色和数据库的配置设置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';
Run Code Online (Sandbox Code Playgroud)

如果没有设置,下一个较低的情况下决定的默认状态search_path,这是postgresql.conf在服务器启动这种情况下或命令行选项。有关的:

取消 设置角色或数据库的任何设置 -search_path在此特定示例中:

ALTER ROLE myrole RESET search_path;
Run Code Online (Sandbox Code Playgroud)

或者:

ALTER DATABASE mydb RESET search_path;
Run Code Online (Sandbox Code Playgroud)

或者:

ALTER ROLE myrole in DATABASE mydb RESET search_path;
Run Code Online (Sandbox Code Playgroud)

切勿pg_catalog.*手动操作系统目录 ( )中的数据。使用ALTER ROLE和手册中的说明使用 DDL 命令ALTER DATABASE
本质上,该RESET命令删除了一行,pg_db_role_setting使基本设置再次生效。我不会说那是复杂的。


Dan*_*ité 9

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

此表中仅存在传递给ALTER USER和 的设置ALTER DATABASE。要获取除这些命令之外配置的值:

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

     SELECT boot_val FROM pg_settings WHERE name='search_path';
    
    Run Code Online (Sandbox Code Playgroud)
  • 会话中任何更改(通过SET命令)之前的设置值可以从数据库中查询:

     SELECT reset_val FROM pg_settings WHERE name='search_path';
    
    Run Code Online (Sandbox Code Playgroud)
  • 当在 中设置非默认值时postgresql.conf独立于当前会话在 SQL 中获取该值并不简单。pg_settings.boot_val不会,因为它会忽略配置文件中的更改,pg_settings.reset_val也不会,因为它会受到可能通过ALTER USER/ALTER DATABASE. DBA 获取值的最简单方法是在postgresql.conf. 否则,请参阅将 search_path 重置为全局集群默认值,其中详细介绍了此主题。


小智 6

select * from pg_user;
Run Code Online (Sandbox Code Playgroud)

对于 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"} ?
????????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

我认为这个用户表包含集群中的所有用户,而不仅仅是特定的数据库——但我没有验证。

  • 任何“角色”都可以充当用户、组或两者。但是暗示用户具有另一种区别。查看目录,我们看到视图 pg_role 和 pg_user 都引用表 pg_authid,但使用谓词 rolcanlogin for users。“用户”可以登录到您的数据库,通常“角色”定义用户继承的授权集。 (2认同)