В краце, хочется иметь одну триггерную функцию на вставку, ну или хотя бы одну на группу таблиц. Имена таблиц содержат оперделённый индекс, этот же индекс используется и в именах полей. [например, table01 -> id01, table02 ->id02]. В триггерной функции, я вычисляю имя поля и сохраняю его в переменной, затем с помощью триггерной процедуры NEW, нужно присвоить этому полю определённый контент, выглядит так:
DECLARE
cFieldName VARCHAR(15);
cTabName VARCHAR(15);
cIndex VARCHAR(3)
BEGIN
cTabName := TG_TABLE_NAME; --например 'table01'
cIndex := substr(cTabNaname,6);
cFieldName := 'id' || cIndex;
-- Теперь в cFieldName находится имя поля 'id01', в которое нам надо запихнуть данные
NEW.%cFieldName% --так вот, вместо cFieldName нужно подставить его содержимое, например 'id01'
В документации ничего подобного не заметил, конечно, можно проблему решить множеством блоков IF - END IF. Но хочется изящества
Спасибо за внимание.
Попробуйте
Попробуйте почитать здесь:
http://www.postgresql.org/docs/8.3/interactive/plpgsql-implementation.ht...
возможно наведёт на какие-то мысли.
Честно говоря, проще было бы если уж разные таблицы, то сделать в них одинаковые имена полей - иначе какой смысл вообще разносить их по разным таблицам? Но дело ваше, что сделано, то сделано. Почитайте ссылочку - может чего полезное найдёте.
-----------------------------------------------------------------------------------
"ls /" (C) Козьма Прутков
Пока эту
Пока эту проблему с макроподстановкой не решил [да наверное возможности такой в plpgsql и нет], а разные имена полей у меня для того, чтобы каждый аттрибут любой таблицы был уникальным в базе.
Вот это-то и не
Вот это-то и не понятно. Если таблицы содержат одинаковые сущности (а во всей видимости это так, раз у вас с ними работает одна и та же функция), то логичней было бы и атрибуты сделать одинаковыми.
Автор впрочем вы и вам виднее, просто тогда не пришлось бы преодолевать проблему по причине её отсутствия.
-----------------------------------------------------------------------------------
"ls /" (C) Козьма Прутков
:). Вот, и как раз
:). Вот, и как раз таки и должно быть понятно, разные таблицы - разные сущности.
Но
Но обрабатываются при этом одним триггером? Очень странно!
По самому вопросу - да я глянул доки и нашёл что-то похожее на то, что тебе нужно. Только увы реализуется оно не подстановкой переменных а блоками IF. Так что соглашусь, что такой возможности в pl/sql нет.
-----------------------------------------------------------------------------------
"ls /" (C) Козьма Прутков
admin> Но
admin> Но обрабатываются при этом одним триггером? Очень странно!
Триггер у каждой таблицы свой, а вот триггерная функция, на которую ссылаются триггеры одна. А у же в ней, я разгребаю откуда и куда. Для меня это наглядней.
admin> Так что соглашусь, что такой возможности в pl/sql нет.
А вот то что такой возможности нет, действительно странно.
используйте
используйте plperl.
plperl
Вот, только из-за этого - "SPI is not yet fully implemented", можно отказался от plperl. Да и plpgsql, можно сказать, классика.