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

  1. postgresql.conf中的所有数据库中的所有angular色设置一个集群范围的默认值(并重新加载)。 小心点!

     search_path = 'blarg,public' 

    此设置的出货默认值是:

     search_path = "$user",public 

    第一个元素指定要search与当前用户同名的模式。 如果不存在这样的模式,则该条目被忽略。

  2. 将其设置为一个数据库的默认值:

     ALTER DATABASE test SET search_path = blarg,public; 
  3. 将其设置为与您连接的angular色 (有效群集范围)的默认值:

     ALTER ROLE foo SET search_path = blarg,public; 
  4. 甚至(通常最好!) 仅作为给定数据库中angular色的默认值:

     ALTER ROLE foo IN DATABASE test SET search_path = blarg,public; 
  5. 在脚本的顶部写上命令(或者在会话中的任何一点执行它:

     SET search_path = blarg,public; 
  6. function范围设置一个特定的search_path (为了保护具有足够权限的恶意用户的安全)。 阅读有关写SECURITY DEFINERfunction安全地在手册中。

 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 ,那么默认值被定义为参数的值。