我需要在Postgres中设置模式路径,这样我就不必每次都指定模式点表,比如schema2.table
。
设置模式路径:
SET SCHEMA PATH a,b,c
在 Mac 上,我只能在一个查询会话中成功设置路径变量。关闭查询窗口后,路径变量会自动恢复为默认值。
我该如何使其永久生效?
我需要在Postgres中设置模式路径,这样我就不必每次都指定模式点表,比如schema2.table
。
设置模式路径:
SET SCHEMA PATH a,b,c
在 Mac 上,我只能在一个查询会话中成功设置路径变量。关闭查询窗口后,路径变量会自动恢复为默认值。
我该如何使其永久生效?
(如果您没有服务器管理员访问权限)
ALTER ROLE <your_login_role> SET search_path TO a,b,c;
两个重要的事情需要知道:
a, b, c
很重要,因为它也是查找表时所用的模式顺序。因此,如果在默认模式之间有相同的表名,则不会产生歧义,服务器始终会使用您指定的第一个模式中的表作为您的 search_path
。ALTER ROLE
之后立即执行SHOW SEARCH_PATH
似乎一开始没有起作用。 - erik-stengelsearch_path
:ALTER DATABASE <database_name> SET search_path TO schema1,schema2;
或者在用户或角色级别上:
ALTER ROLE <role_name> SET search_path TO schema1,schema2;
或者在角色+数据库级别进行操作(感谢Chris指出!):
ALTER ROLE <role_name> IN DATABASE <database_name> SET search_path TO schema1,schema2;
如果你在所有的数据库中都有一个共同的默认模式,那么你可以使用search_path选项在配置文件中设置系统范围内的默认值。
当创建数据库时,默认情况下它是从名为template1的隐藏“模板”数据库创建的,你可以更改该数据库以指定所有以后创建的数据库的新默认搜索路径。你也可以创建另一个模板数据库,并使用CREATE DATABASE <database_name> TEMPLATE <template_name>
来创建你的数据库。
Josh是正确的,但他忽略了一个变化:
ALTER ROLE <role_name> IN DATABASE <db_name> SET search_path TO schema1,schema2;
设置用户在一个特定数据库中的搜索路径。
search_path
,那么可能会有风险:https://blog.bigsmoke.us/2022/11/11/postgresql-schema-search_path简而言之:不要在SECURITY DEFINER
例程中使用search_path
,确保您控制search_path
中的所有模式,并且在依赖于search_path
的SECURITY INVOKER
例程中要小心,特别是这些例程执行生成随机密码重置令牌等操作时。 - BigSmoke