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