性能方面,为 INSERT、DELETE 和 UPDATE 事件创建一个单独的触发器还是为所有事件创建一个更好?
Performance wise, is it better to create a separate triggers for INSERT, DELETE and UPDATE events or just one for all the events
为了维护 table test_table
的审核日志,我需要在基础 table 上为 INSERT、UPDATE 和 DELETE 事件创建触发器,然后将这些记录插入审计 table。
我可以通过以下方式创建触发器(以及相关过程):
创建程序为:
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();
其他选项是为单个事件创建 trigger/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 但它没有回答我的问题。
如果您编写三个更简单的函数,您将节省一点执行时间,但我怀疑是否值得付出努力。
如果性能最重要,您可以考虑用 C 编写触发器函数。
为了维护 table test_table
的审核日志,我需要在基础 table 上为 INSERT、UPDATE 和 DELETE 事件创建触发器,然后将这些记录插入审计 table。
我可以通过以下方式创建触发器(以及相关过程):
创建程序为:
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();
其他选项是为单个事件创建 trigger/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 但它没有回答我的问题。
如果您编写三个更简单的函数,您将节省一点执行时间,但我怀疑是否值得付出努力。
如果性能最重要,您可以考虑用 C 编写触发器函数。