【问题标题】:Performance wise, is it better to create a separate triggers for INSERT, DELETE and UPDATE events or just one for all the events性能方面,是为 INSERT、DELETE 和 UPDATE 事件创建单独的触发器,还是为所有事件创建一个触发器更好
【发布时间】:2018-10-07 03:13:04
【问题描述】:

为了维护表test_table 的审计日志,我需要在基表上为INSERT、UPDATE 和DELETE 事件创建触发器,然后将这些记录插入到审计表中。 我可以通过以下方式创建触发器(以及相关的过程):

创建过程为:

CREATE OR REPLACE FUNCTION audit_test_table_function() RETURNS TRIGGER AS $body$
BEGIN
    IF (TG_OP = 'DELETE') THEN
        INSERT INTO audit_test_table VALUES (OLD.*, now(), user, pg_backend_pid(), 'D', DEFAULT);
        RETURN OLD;
    ELSIF (TG_OP = 'UPDATE') THEN
        INSERT INTO audit_test_table VALUES (NEW.*, now(), user, pg_backend_pid(), 'U', DEFAULT);
        RETURN NEW;
    ELSIF (TG_OP = 'INSERT') THEN
        INSERT INTO audit_test_table VALUES (NEW.*, now(), user, pg_backend_pid(), 'I', DEFAULT);
        RETURN NEW;
    END IF;
    RETURN NULL;
END; $body$ LANGUAGE plpgsql;

然后创建触发器:

CREATE TRIGGER audit_test_table_trigger AFTER INSERT OR UPDATE OR DELETE ON test_table FOR EACH ROW EXECUTE PROCEDURE audit_test_table_function();

其他选项是为单个事件创建触发器/函数,即为 DELETE 事件单独创建一个,如下所示:

CREATE OR REPLACE FUNCTION audit_test_table_delete_function() RETURNS TRIGGER AS $body$
    BEGIN
        INSERT INTO audit_test_table VALUES (OLD.*, now(), user, pg_backend_pid(), 'D', DEFAULT);
        RETURN OLD;
    END;
$body$ LANGUAGE plpgsql;


CREATE TRIGGER audit_test_table_trigger AFTER DELETE ON test_table FOR EACH ROW EXECUTE PROCEDURE audit_test_table_delete_function();

对于 INSERT 和 UPDATE 事件也是如此。

我的问题是性能方面推荐哪一个。还有什么我应该记住的吗?

我已经检查了this,但它没有回答我的问题。

【问题讨论】:

    标签: postgresql database-trigger


    【解决方案1】:

    如果你写三个更简单的函数,你会节省一点执行时间,但我怀疑这是否值得。

    如果性能至关重要,您可以考虑用 C 编写触发函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-03
      • 1970-01-01
      相关资源
      最近更新 更多