search_path如何影响标识符parsing和“当前模式”
是否可以定义默认情况下在哪个模式中创build新表? (被称为“不合格的表格名称”。)
我已经看到了在Postgres中使用“searchpath”的一些细节,但是我认为它只能在检索数据而不是创build时使用。
我有一堆SQL脚本,它们创build了很多表。 而不是修改脚本,我想默认设置数据库创build表在一个特定的架构 – 当他们有不合格的名字。
这可能吗?
searchpath确实是你想要的:
% create schema blarg; % set search_path to blarg; % create table foo (id int); % \d List of relations Schema | Name | Type | Owner --------+------+-------+------- blarg | foo | table | pgsql
什么是searchpath?
每个文档:
[…]表通常由非限定名称引用,这些名称仅由表名组成。 系统根据searchpath来确定哪个表格的意思,该searchpath是要查找的模式列表 。
大胆重视我的。 这解释了标识符的parsing ,而“当前模式”是根据文档:
searchpath中命名的第一个模式称为当前模式 。 除了被search的第一个模式之外,如果
CREATE TABLE
命令没有指定模式名称,它也是创build新表的模式。
大胆重视我的。 系统模式pg_temp
(当前会话的临时对象的模式)和pg_catalog
自动成为searchpath的一部分,并按此顺序首先search。 每个文档:
pg_catalog
总是有效的searchpath的一部分。 如果在path中没有显式地命名,那么在searchpath的模式之前隐式地search它。 这确保了内置的名字将永远是可以find的。 但是,如果您希望用户定义的名称覆盖内置名称,则可以明确地将pg_catalog
放在searchpath的末尾。
大胆重视按原。 而pg_temp
之前,除非它被放在一个不同的位置。
如何设置?
您有各种选项来实际设置运行时variablessearch_path
。
-
为
postgresql.conf
中的所有数据库中的所有angular色设置一个集群范围的默认值(并重新加载)。 小心点!search_path = 'blarg,public'
此设置的出货默认值是:
search_path = "$user",public
第一个元素指定要search与当前用户同名的模式。 如果不存在这样的模式,则该条目被忽略。
-
将其设置为一个数据库的默认值:
ALTER DATABASE test SET search_path = blarg,public;
-
将其设置为与您连接的angular色 (有效群集范围)的默认值:
ALTER ROLE foo SET search_path = blarg,public;
-
甚至(通常最好!) 仅作为给定数据库中的angular色的默认值:
ALTER ROLE foo IN DATABASE test SET search_path = blarg,public;
-
在脚本的顶部写上命令(或者在会话中的任何一点执行它:
SET search_path = blarg,public;
-
为function的范围设置一个特定的
search_path
(为了保护具有足够权限的恶意用户的安全)。 阅读有关写SECURITY DEFINER
function安全地在手册中。
CREATE FUNCTION foo() RETURNS void AS $func$ BEGIN -- do stuff END $func$ LANGUAGE plpgsql SECURITY DEFINER SET search_path=blarg,public,pg_temp ;
我列表中的数字越大,数字越低。
手册有更多的方法 ,比如设置环境variables或者使用命令行选项。
要查看当前设置:
SHOW search_path;
重置它:
RESET search_path;
每个文档 :
如果在当前会话中没有发出
SET
,那么默认值被定义为参数的值。