Я не уверен, как добиться чего-то вроде следующего:
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.*
, кажется, преобразован в строку и обработан методом get, что приводит к всевозможным проблемам типов (например, NULL
значения).
Есть идеи?