0

我想改进当特定用户进行修改时禁用 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(),但我不知道如何。会有什么不同吗?

4

1 回答 1

3

正如 a_horse_with_no_name 所指出的,在较新的版本中,触发器可以根据文档使用to子句WHEN以表达式为条件。CREATE TRIGGERCREATE TRIGGER

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

(请注意,current_user它受 影响SECURITY DEFINER。您可能更喜欢使用它session_user。)

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

于 2013-01-09T12:29:16.143 回答