Я хотел бы знать, может ли 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
вызовет ограничение уникальности, если это необходимо.
Заранее благодарим за вашу помощь. !