是否可以定义默认情况下在哪个模式中创建新表?(由“非限定表名”引用。)我在Postgres中看到了一些关于使用“搜索路径”的细节,但我认为它只在检索数据时有效,而在创建数据时无效。我有一堆SQL脚本,它们创建了许多表。我不想修改脚本,而是想设置数据库默认在特定的模式中创建表-当它们有非限定名称时。这可能吗?
w80xi6nr1#
search_path
本手册:[...]表通常由非限定名称引用,非限定名称仅由表名组成。系统通过跟随搜索路径来确定哪个表,搜索路径是要查找的模式列表。我的粗体强调。这解释了标识符解析。根据文档,“当前模式”(或“默认模式”)为:搜索路径中命名的第一个方案称为当前方案。除了是搜索的第一个方案之外,如果CREATE TABLE命令未指定方案名,则该方案也是将在其中创建新表的方案。粗体强调的是mine。系统模式**pg_temp(当前会话的临时对象的模式)和pg_catalog自动成为搜索路径的一部分,并按以下顺序 * 首先 * 进行搜索。手册:pg_catalog始终是搜索路径的有效组成部分。如果未在路径中显式命名,则会在搜索路径的方案之前隐式搜索它。这可确保始终可以找到内置名称。但是,如果希望用户定义的名称覆盖内置名称,则可以显式将pg_catalog放在搜索路径的末尾。粗体强调与原文一致。pg_temp在此之前,除非它被放在不同的位置。
CREATE TABLE
pg_temp
pg_catalog
设置运行时变量**search_path的方法有很多种。1.在postgresql.conf中为所有数据库中的所有角色设置一个集群**范围的默认值(并重新加载)。请小心!
postgresql.conf
search_path = 'blarg,public'
此设置的出厂默认值为:
search_path = "$user",public
备注:
第一个元素指定要搜索与当前用户同名的架构。如果不存在这样的架构,则忽略该条目。还有:如果其中一个列表项是特殊名称$user,则会替换具有由CURRENT_USER返回的名称的架构,前提是存在这样的架构并且用户对该架构具有USAGE权限。(如果没有,则忽略$user。)1.将其设置为一个数据库的默认值:
$user
CURRENT_USER
USAGE
ALTER DATABASE test SET search_path = blarg,public;
1.将其设置为您连接的role的默认值(在群集范围内有效):
ALTER ROLE foo SET search_path = blarg,public;
1.或者甚至(通常是最好的!)作为数据库中角色的默认值:
ALTER ROLE foo IN DATABASE test SET search_path = blarg,public;
1.将命令写在脚本的顶部。或者在DB会话中执行该命令:
SET search_path = blarg,public;
1.为函数的作用域设置一个特定的search_path(以防止具有足够权限的恶意用户使用)。请阅读手册中的“安全编写SECURITY DEFINER函数”。
SECURITY DEFINER
CREATE FUNCTION foo() RETURNS void LANGUAGE plpgsql SECURITY DEFINER**SET search_path=blarg,public,pg_temp** AS $func$ BEGIN -- do stuff END $func$;
列表中的数字越大,数字越小。manual has even more ways,就像设置环境变量或使用命令行选项一样。要查看当前设置:
SHOW search_path;
要执行此操作,请执行以下操作:
RESET search_path;
The manual:默认值定义为在当前会话中没有为该参数发出任何SET时该参数应有的值。
SET
8qgya5xd2#
搜索路径确实是你想要的:
% 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
2条答案
按热度按时间w80xi6nr1#
模式搜索路径
search_path
是什么?本手册:
[...]表通常由非限定名称引用,非限定名称仅由表名组成。系统通过跟随搜索路径来确定哪个表,搜索路径是要查找的模式列表。
我的粗体强调。这解释了标识符解析。
根据文档,“当前模式”(或“默认模式”)为:
搜索路径中命名的第一个方案称为当前方案。除了是搜索的第一个方案之外,如果
CREATE TABLE
命令未指定方案名,则该方案也是将在其中创建新表的方案。粗体强调的是mine。系统模式**
pg_temp
(当前会话的临时对象的模式)和pg_catalog
自动成为搜索路径的一部分,并按以下顺序 * 首先 * 进行搜索。手册:pg_catalog
始终是搜索路径的有效组成部分。如果未在路径中显式命名,则会在搜索路径的方案之前隐式搜索它。这可确保始终可以找到内置名称。但是,如果希望用户定义的名称覆盖内置名称,则可以显式将pg_catalog
放在搜索路径的末尾。粗体强调与原文一致。
pg_temp
在此之前,除非它被放在不同的位置。如何设置?
设置运行时变量**
search_path
的方法有很多种。1.在
postgresql.conf
中为所有数据库中的所有角色设置一个集群**范围的默认值(并重新加载)。请小心!此设置的出厂默认值为:
备注:
第一个元素指定要搜索与当前用户同名的架构。如果不存在这样的架构,则忽略该条目。
还有:
如果其中一个列表项是特殊名称
$user
,则会替换具有由CURRENT_USER
返回的名称的架构,前提是存在这样的架构并且用户对该架构具有USAGE
权限。(如果没有,则忽略$user
。)1.将其设置为一个数据库的默认值:
1.将其设置为您连接的role的默认值(在群集范围内有效):
1.或者甚至(通常是最好的!)作为数据库中角色的默认值:
1.将命令写在脚本的顶部。或者在DB会话中执行该命令:
1.为函数的作用域设置一个特定的
search_path
(以防止具有足够权限的恶意用户使用)。请阅读手册中的“安全编写SECURITY DEFINER
函数”。列表中的数字越大,数字越小。
manual has even more ways,就像设置环境变量或使用命令行选项一样。
要查看当前设置:
要执行此操作,请执行以下操作:
The manual:
默认值定义为在当前会话中没有为该参数发出任何
SET
时该参数应有的值。8qgya5xd2#
搜索路径确实是你想要的: