search_path如何影响标识符解析和“当前架构”

时间:2012-01-30 16:38:28

标签: postgresql schema database-table search-path

是否可以定义默认情况下创建新表的模式? (由“不合格的表名称”引用。)

我已经看到了有关在Postgres中使用“搜索路径”的一些细节,但我认为它只在检索数据时有效,而不是创建。

我有一堆SQL脚本,可以创建许多表。我想要在特定模式中设置数据库创建表,而不是修改脚本 - 当它们具有不合格的名称时。

这可能吗?

2 个答案:

答案 0 :(得分:63)

搜索路径是什么?

Per documentation:

  

[...]表通常由不合格的名称引用,其中包括   只是表名。系统确定表示哪个表   遵循搜索路径,要查看的模式列表

大胆强调我的。这解释了标识符解析“当前架构”是,per documentation:

  

搜索路径中指定的第一个模式称为当前   模式即可。除了是第一个搜索的模式,它也是   如果CREATE TABLE命令将在其中创建新表的模式   没有指定架构名称。

大胆强调我的。系统架构 pg_temp (当前会话的临时对象架构)和 pg_catalog 自动成为搜索路径的一部分并搜索首先,按此顺序。 Per documentation:

  

pg_catalog始终是搜索路径的有效组成部分。如果不是   在路径中明确命名,然后在之前隐式搜索   搜索路径的模式。这确保了内置名称   总是可以找到的。但是,您可以明确地将pg_catalog放在   如果您希望拥有用户定义的名称,则搜索路径的结尾   覆盖内置名称。

按原文大胆强调。而且pg_temp在此之前,除非它被置于不同的位置。

如何设置?

您可以使用各种选项来实际设置运行时变量search_path

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

    search_path = 'blarg,public'
    

    shipped default for this setting是:

    search_path = "$user",public
    
      

    第一个元素指定一个与其名称相同的模式   当前用户将被搜索。如果不存在此类模式,则忽略该条目。

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

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

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

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

    SET search_path = blarg,public;
    
  6. 范围的功能设置特定search_path(以保护具有足够权限的恶意用户)。请阅读手册中的Writing SECURITY DEFINER Functions Safely

  7. CREATE FUNCTION foo() RETURNS void AS
    $func$
    BEGIN
       -- do stuff
    END
    $func$ LANGUAGE plpgsql SECURITY DEFINER
           SET search_path=blarg,public,pg_temp;

    我的列表中的数字越大,数字越低 manual has even more ways,与设置环境变量或使用命令行选项一样。

    要查看当前设置:

    SHOW search_path;
    

    reset

    RESET search_path;
    

    Per documentation

      

    默认值定义为参数的值   如果在本届会议上没有为其发布过SET,那就已经有了。

答案 1 :(得分:26)

搜索路径确实是您想要的:

% 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