是否可以定义默认情况下创建新表的模式? (由“不合格的表名称”引用。)
我已经看到了有关在Postgres中使用“搜索路径”的一些细节,但我认为它只在检索数据时有效,而不是创建。
我有一堆SQL脚本,可以创建许多表。我想要在特定模式中设置数据库创建表,而不是修改脚本 - 当它们具有不合格的名称时。
这可能吗?
答案 0 :(得分:63)
[...]表通常由不合格的名称引用,其中包括 只是表名。系统确定表示哪个表 遵循搜索路径,要查看的模式列表。
大胆强调我的。这解释了标识符解析,“当前架构”是,per documentation:
搜索路径中指定的第一个模式称为当前 模式即可。除了是第一个搜索的模式,它也是 如果
CREATE TABLE
命令将在其中创建新表的模式 没有指定架构名称。
大胆强调我的。系统架构 pg_temp
(当前会话的临时对象架构)和 pg_catalog
自动成为搜索路径的一部分并搜索首先,按此顺序。 Per documentation:
pg_catalog
始终是搜索路径的有效组成部分。如果不是 在路径中明确命名,然后在之前隐式搜索 搜索路径的模式。这确保了内置名称 总是可以找到的。但是,您可以明确地将pg_catalog
放在 如果您希望拥有用户定义的名称,则搜索路径的结尾 覆盖内置名称。
按原文大胆强调。而且pg_temp
在此之前,除非它被置于不同的位置。
您可以使用各种选项来实际设置运行时变量search_path
。
为postgresql.conf
中的所有数据库中的所有角色设置群集 - 范围默认值(并重新加载)。小心!
search_path = 'blarg,public'
shipped default for this setting是:
search_path = "$user",public
第一个元素指定一个与其名称相同的模式 当前用户将被搜索。如果不存在此类模式,则忽略该条目。
将其设置为一个数据库的默认值:
ALTER DATABASE test SET search_path = blarg,public;
将其设置为您连接的角色的默认设置(有效的群集范围):
ALTER ROLE foo SET search_path = blarg,public;
或者甚至(通常最好!)作为仅在给定数据库中角色的默认值:
ALTER ROLE foo IN DATABASE test SET search_path = blarg,public;
将命令写在脚本的顶部(或者在会话中的任何一点执行它:
SET search_path = blarg,public;
为范围的功能设置特定search_path
(以保护具有足够权限的恶意用户)。请阅读手册中的Writing SECURITY DEFINER
Functions Safely。
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;
默认值定义为参数的值 如果在本届会议上没有为其发布过
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