Это триггер, вызываемый либо вставкой, либо обновлением, либо удалением в таблице. Гарантируется, что в вызывающей таблице все столбцы затронуты, и также существует таблица удалений.
CREATE OR REPLACE FUNCTION sample_trigger_func() RETURNS TRIGGER AS $$
DECLARE
    operation_code char;
    table_name varchar(50);
    delete_table_name varchar(50);
    old_id integer; 
BEGIN
table_name = TG_TABLE_NAME;
delete_table_name = TG_TABLE_NAME || '_deletes';
SELECT SUBSTR(TG_OP, 1, 1)::CHAR INTO operation_code;
IF TG_OP = 'DELETE' THEN
    OLD.mod_op = operation_code;
    OLD.mod_date = now();
    RAISE INFO 'OLD: %', (OLD).name;
    EXECUTE format('INSERT INTO %s VALUES %s', delete_table_name, (OLD).*);
ELSE
    EXECUTE format('UPDATE TABLE %s SET mod_op = %s AND mod_date = %s'
                  , TG_TABLE_NAME, operation_code, now());
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
Разветвление ELSE запускает бесконечный цикл. Там может быть больше проблем.
Как это исправить?
