По производительности лучше создавать отдельные триггеры для событий INSERT, DELETE и UPDATE или только один для всех событий - PullRequest
0 голосов
/ 26 апреля 2018

Для ведения журнала аудита для таблицы 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.

Мой вопрос касается производительности, какой из них рекомендуется. И есть ли еще что-то, что я должен иметь в виду?

Я уже проверил это , но он не отвечает на мой вопрос.

1 Ответ

0 голосов
/ 26 апреля 2018

Вы сэкономите немного времени на выполнение, если напишите три более простых функции, но я сомневаюсь, что это стоит усилий.

Если производительность имеет первостепенное значение, вы можете написать функции триггера на C.

...