出于测试目的,我提供了我自己的实现now()
函数是public.now()
. Using search_path
覆盖默认值pg_catalog.now()
我自己的版本大多有效,但我有一个表,其中一个表的默认表达式为now()
。显示该表会产生类似于以下内容的内容:
start_date | date | not null default now()
但是,在模式保存和恢复(到测试数据库)之后,相同的显示表会生成
start_date | date | not null default pg_catalog.now()
我由此假设,最初默认表达式中的函数未绑定到任何模式,并且 search_path 将用于查找正确的路径。然而,转储或恢复操作似乎将该功能“绑定”到当前功能。
我对函数“绑定状态”的理解是否正确?
有没有办法保持函数跨转储/恢复边界的无界性?
默认值在创建时解析(早期绑定!)。您在 psql、pgAdmin 或其他客户端中看到的是文本表示,但实际上,OID
函数的now()
创建列时默认值存储在系统目录中pg_attrdef。我引用:
adbin
pg_node_tree
列默认值,在nodeToString()
表示。使用pg_get_expr(adbin, adrelid)
将其转换为 SQL 表达式。
改变search_path可能会导致 Postgresdisplay函数名称经过模式限定,因为当前的函数将无法正确解析它search_path
.
dump和restore与你的自定义无关search_path
环境。他们明确地设定了它。所以你看到的与转储/恢复周期无关。
覆盖内置函数
Placing public
before pg_catalog
in the search_path
is a 危险游戏。弱势用户(包括您自己)通常被允许在那里编写并创建可能无意中推翻系统功能的函数 - 产生任意(或恶意)结果。
你想要一个访问受限的专用模式覆盖内置函数。使用类似这样的东西:
SET search_path = override, pg_catalog, public;
详情在此dba.SE 上的相关答案.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)