优化在PostgreSQL中排除特定用户的触发器

时间:2013-01-09 10:24:53

标签: performance postgresql triggers

我想改进特定用户进行修改时禁用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()部分中嵌入条件,但我无法找到方法。会有什么不同吗?

1 个答案:

答案 0 :(得分:3)

正如a_horse_with_no_name指出的那样,根据CREATE TRIGGER documentation,在较新的版本上,触发器可以使用WHEN子句到CREATE TRIGGER的表达式为条件。

这在8.4中不可用,因此您已经在使用最佳可用选项,在触发器内测试current_user并返回。

(请注意,current_userSECURITY DEFINER影响。您可能更愿意使用session_user。)

通常,运行立即退出的触发器对性能的影响相当小,特别是与索引和表插入/更新的成本相比。我不会太担心;悬挂性能水果可能较低。