IMMUTABLE 表示该函数不能修改数据库,并且在给定相同的参数值时始终返回相同的结果;也就是说,它不进行数据库查找或以其他方式使用未直接出现在其参数列表中的信息。如果给出此选项,则任何带有全常量参数的函数调用都可以立即替换为函数值。
我已经阅读了 Postgres 中有关不可变函数的文档,但仍然对以下示例感到困惑,无法将它们分类为不可变!
raise notice
的函数CREATE OR REPLACE FUNCTION text_equals(text, text)
RETURNS boolean AS $$
BEGIN
RAISE NOTICE 'Comparing two texts';
RETURN $1 = $2;
END;
$$ LANGUAGE plpgsql;
current_user
CREATE OR REPLACE FUNCTION fun()
RETURNS TEXT AS $$
DECLARE
current_user_text TEXT;
BEGIN
current_user_text := 'Current user is ' || current_user;
RETURN current_user_text;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
上面的第三点,我想不能是不可变的函数,但只是想检查函数何时是用户打印出来的安全定义器
不,你的函数不是一成不变的。
这与当前用户或安全定义者等无关,如果与返回不确定值有关。如果仅根据输入参数就可以计算返回值,则该函数是不可变的。