当前位置: 首页 > 面试题库 >

什么时候/如何将默认值表达式函数与search_path绑定在一起?

万博涛
2023-03-14
问题内容

为了进行测试,我提供了自己的now()函数实现public.now()。使用我自己的版本search_path覆盖默认值pg_catalog.now()通常可以,但是我有一个表,其表的默认表达式为now()。显示该表会产生类似于以下内容的信息:

 start_date   | date    | not null default now()

但是,在保存和还原架构(到测试数据库)之后,将生成相同的show table

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

我以此为前提,最初,默认表达式中的函数未绑定到任何模式,并且search_path将用于查找正确的函数。但是,转储或还原操作似乎将功能“绑定”到当前功能。

我对函数的“绑定状态”的理解正确吗?有没有办法在转储/还原边界之间保持函数的非绑定性?


问题答案:

默认值在创建时进行解析(早期绑定!)。你在psql里,pgAdmin的或其他客户看到的是一个文本表示,但事实上,该OID功能now()在创建列默认的时间存储在系统目录中pg_attrdef。我引用:

adbin   pg_node_tree  The internal representation of the column default value
adsrc   text          A human-readable representation of the default value

当您更改时search_path,这会使Postgres显示限定模式的函数的名称,因为使用current不能再正确解析该函数​​的名称search_path

转储和还原与您的自定义search_path设置无关。他们明确地设置了它。因此,您所看到的与转储/还原周期无关。

覆盖内置功能

配售publicpg_catalogsearch_path是一个 危险的游戏
。特权不足的用户(包括您自己)通常被允许在此处编写和创建可能无意中否决系统功能的功能-结果是任意的(或恶意的)。

您希望 具有受限访问权限专用架构 覆盖内置函数。使用类似这样的东西:

SET search_path = **override, pg_catalog** , public;

有关dba.SE的相关答案中的详细信息。



 类似资料:
  • 我分配给类的属性是: 我需要设置ISSOLD,并敦促其设置为false。这就是我创建默认构造函数的原因。但是我使用Builder()来设置类字段,并且在某个地方使用getter/setter来设置属性。 我的要求是将isPurpressed/IsSoldOut设置为True/False,但不能为NULL。 请指导我如何才能做到这一点。

  • 本文向大家介绍函数声明与函数表达式有什么区别?相关面试题,主要包含被问及函数声明与函数表达式有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 函数声明 function fn() { ///... } 函数表达式 const aa = function() { ///... } 区别: 1.函数声明,函数名必须有,在函数表达式中可以省略函数名 2.函数声明会被预解析,函数表达式不会

  • 我的jsp表单中有一些数字字段(但不是强制的),例如kkqty、sogoqty和sesaqty。因此,当用户没有在这些字段中输入任何内容时,我在控制器端接收到null,因此在保存这些表单数据时会出现Null属性异常 我的POJO(OutletInfo.java) 我的控制器 在控制器中,当我尝试打印所有数值字段时,我在这里收到空值,因此无法保存。 我需要将null转换为默认值0.0,我知道我需要检

  • 问题内容: 我有许多函数结合了位置参数和关键字参数,我想将它们的参数之一绑定到给定值(仅在函数定义之后才知道)。有一般的方法吗? 我的第一次尝试是: 但是,为此,我需要知道传递给的确切args ,并且不能使用单个函数来绑定我感兴趣的所有函数(因为它们具有不同的参数列表)。 问题答案: from functools import partial >>> def f(a, b, c): … print

  • 我有一个Spring Boot服务,它为POST请求正文使用自定义POJO类。当客户端将其中一个字段传递为null时,我希望该值设置为0。 由以下控制器使用: Spring boot将为我处理从JSON到的数据绑定,但是每当作为null传递时,我希望它保留0。有没有正确的方法来做到这一点,或者我必须自己解析类并设置值?目前,如果客户端在其请求JSON中没有传递此字段,它将保留默认值,但是,我希望即