Я не уверен, как добиться чего-то вроде следующего:
CREATE OR REPLACE FUNCTION fnJobQueueBEFORE() RETURNS trigger AS $$
DECLARE
shadowname varchar := TG_TABLE_NAME || 'shadow';
BEGIN
INSERT INTO shadowname VALUES(OLD.*);
RETURN OLD;
END;
$$
LANGUAGE plpgsql;
т.е. вставка значений в таблицу с динамически сгенерированным именем.
Выполнение приведенного выше кода дает:
ERROR: relation "shadowname" does not exist
LINE 1: INSERT INTO shadowname VALUES(OLD.*)
Кажется, что переменные не расширяются/не разрешаются, как имена таблиц. Я не нашел ссылки на это в руководстве Postgres.
Я уже экспериментировал с EXECUTE
следующим образом:
EXECUTE 'INSERT INTO ' || quote_ident(shadowname) || ' VALUES ' || OLD.*;
Но не повезло:
ERROR: syntax error at or near ","
LINE 1: INSERT INTO personenshadow VALUES (1,sven,,,)
Тип RECORD
кажется потерянным: OLD.*
похоже, преобразован в строку и получает репарацию, что приводит к разным типам проблем (например, значения NULL
).
Любые идеи?