PostgreSQL Триггер перед вставкой для каждого оператора - PullRequest
0 голосов
/ 08 мая 2020

Я хотел бы знать, может ли Posgre SQL (12) запускать триггер перед вставкой , для каждого оператора (для проблем с производительностью)? Если да, то как получить доступ (фактически изменить) вставляемые строки изнутри запущенной функции?

Я думаю о чем-то вроде следующего:

CREATE OR REPLACE FUNCTION tr_process() RETURNS TRIGGER AS $$
BEGIN
    IF TG_OP IN ('UPDATE', 'INSERT') THEN
        UPDATE new_table 
        SET field_to_set = other_table.field
        FROM other_table
        WHERE new_table.id_to_other_table = other_table.id ;
    END IF;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER tr_process_ins
    BEFORE INSERT ON temp
    REFERENCING NEW TABLE AS new_table
    FOR EACH STATEMENT EXECUTE FUNCTION tr_process();
CREATE TRIGGER tr_process_upd
    BEFORE UPDATE ON temp
    REFERENCING OLD TABLE AS old_table NEW TABLE AS new_table
    FOR EACH STATEMENT EXECUTE FUNCTION tr_process();

Это в настоящее время работает мне ERROR: transition table name can only be specified for an AFTER trigger.

Я пробовал for each row триггер, но его стоимость намного дороже, чем, например, простое включение оператора INNER JOIN в оператор INSERT, чтобы иметь правильный field_to_set.

Я смотрю на триггер BEFORE, так как ожидаю, что новое значение field_to_set вызовет ограничение уникальности, если это необходимо.

Заранее благодарим за вашу помощь. !

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...