重命名列后,函数调用失败(错误42703“列不存在”)

简单方案:

CREATE TABLE foo (bar int);

INSERT INTO foo VALUES (42);

CREATE FUNCTION baz() RETURNS int AS $$
SELECT bar
FROM foo
$$ LANGUAGE SQL;

SELECT baz();

这有效并返回42。

我不喜欢我的列命名,所以我将其重命名:

ALTER TABLE foo RENAME bar TO qux;

但是现在,如果我再次调用该函数:

SELECT baz();
  

[42703]错误:列“ bar”不存在

     

内联过程中的SQL函数“ baz”

我希望重命名为“级联”为函数体,因为PostgreSQL会阻止使用无效的列引用创建函数。

我真的必须重新创建通过旧名称引用该列的每个函数吗?使用版本10.7。

yingzi_06 回答:重命名列后,函数调用失败(错误42703“列不存在”)

文档说功能主体为a string constant whose meaning depends on the language。语言处理程序和the database server has no built-in knowledge about how to interpret the function's source text在运行时对此进行解释。

因此PostgreSQL不跟踪任何依赖关系,该函数按名称而不是按对象ID引用表和列(就像视图一样)。

因此PostgreSQL不能仅仅因为改变了函数体字符串的名称而仅仅更改了函数体字符串,因为该表列以一种PostgreSQL不知道的语法被引用了。

本文链接:https://www.f2er.com/3070496.html

大家都在问