我想改进特定用户进行修改时禁用PostgreSQL中的触发器的方式。
例如:触发器应该无视“应用程序”所做的更改。用户并从任何其他用户的每次修改开始。
我目前正在使用以下代码:
IF (CURRENT_USER = 'app') THEN
RETURN NULL;
END IF;
如:
CREATE OR REPLACE FUNCTION update_flag() RETURNS trigger AS $BODY$
BEGIN
IF (CURRENT_USER = 'app') THEN
RETURN NULL;
END IF;
IF (TG_OP = 'INSERT') THEN
...
ELSIF (TG_OP = 'UPDATE') THEN
...
ELSIF (TG_OP = 'DELETE') THEN
...
END IF;
RETURN NULL;
END;$BODY$
LANGUAGE plpgsql;
CREATE TRIGGER trigger_categories AFTER INSERT OR UPDATE OR DELETE
ON "categories"
FOR EACH ROW
EXECUTE PROCEDURE update_flag();
你觉得这里有改进的余地吗?在调用CREATE TRIGGER
之前,我考虑过在update_flag()
部分中嵌入条件,但我无法找到方法。会有什么不同吗?
答案 0 :(得分:3)
正如a_horse_with_no_name指出的那样,根据CREATE TRIGGER
documentation,在较新的版本上,触发器可以使用WHEN
子句到CREATE TRIGGER
的表达式为条件。
这在8.4中不可用,因此您已经在使用最佳可用选项,在触发器内测试current_user
并返回。
(请注意,current_user
受SECURITY DEFINER
影响。您可能更愿意使用session_user
。)
通常,运行立即退出的触发器对性能的影响相当小,特别是与索引和表插入/更新的成本相比。我不会太担心;悬挂性能水果可能较低。