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 ROLE
和ALTER DATABASE
的手册中的说明使用DDL命令。实质上,
RESET
命令从pg_db_role_setting
中删除一行,使基本设置再次生效。我不会说那令人费解的。#2 楼
数据库和角色的永久设置都存储在pg_db_role_settings系统集群范围的表中。仅传递给
ALTER USER
和ALTER 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
评论
哇。我没有想到这会令人费解。您将如何取消给定的数据库和角色设置?执行更改角色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