gpt4 book ai didi

sql - 默认值表达式函数何时/如何绑定(bind)到 search_path?

转载 作者:行者123 更新时间:2023-11-29 13:30:25 25 4
gpt4 key购买 nike

出于测试目的,我提供了我自己的 now() 函数实现,即 public.now()。使用 search_path 用我自己的版本覆盖默认的 pg_catalog.now() 大多数情况下是可行的,但我有一个表,其中的表的默认表达式为 now( )。显示表格会产生类似于以下内容的内容:

 start_date   | date    | not null default now()

但是,在模式保存和恢复(到测试数据库)之后,生成相同的显示表

 start_date   | date    | not null default pg_catalog.now()

我由此假设,最初默认表达式中的函数未绑定(bind)到任何模式,搜索路径将用于查找正确的模式。但是,转储或恢复操作似乎将函数“绑定(bind)”到当前函数。

我对函数“绑定(bind)状态”的理解是否正确?有没有办法在转储/恢复边界之间保持函数的无界性?

最佳答案

默认值在创建时被解析(早期绑定(bind)!)。您在 psql、pgAdmin 或其他客户端中看到的是文本表示,但实际上,函数 now() 在创建列 default 时的 OID 是存放在系统目录pg_attrdef .我引用:

adbin pg_node_tree

The column default value, in nodeToString() representation. Usepg_get_expr(adbin, adrelid) to convert it to an SQL expression.

更改 search_path可能会导致 Postgres 显示函数模式限定的名称,因为它不会再用当前的 search_path 正确解析。

转储和恢复与您的自定义 search_path 设置无关。他们明确地设置了它。所以你看到的与转储/恢复周期无关。

覆盖内置函数

search_path 中将 public 放在 pg_catalog 之前是一个冒险游戏。低权限用户(包括您自己)通常被允许在那里编写并创建可能无意中否决系统功能的功能 - 具有任意(或恶意)结果。

您需要一个具有受限访问权限的专用模式 来覆盖内置函数。改用这样的东西:

SET search_path = override, pg_catalog, public;

详情请见 related answer on dba.SE .

关于sql - 默认值表达式函数何时/如何绑定(bind)到 search_path?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25068040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com