Подстановка имени поля в триггере

Задача: написать триггер который будет вести лог изменении данных таблицы.
Нюанс: триггер должен работать независимо от изменения структуры таблицы.
Пример:
В таблице три поля- имя, фамилия, отчество. При вставке записи триггер пишет в лог 3 записи
(имя поля) (значение)
1.имя иван
2.фамилия иванов
3.отчество иванович
Так вот, чтобы триггер работал независимо от изменения структуры таблицы я выбираю имена полей для данной таблицы из information_schema и пытаюсь подставить в имя поля для псевдонима new, в цикле по полям выполняю: (execute 'insert into log (name,value) values ('||n||',new.'||n||')' - как-то так... ). Собственно проблема в том, что new в execute не видится.
Есть ли у кого-нибудь мысли по этому поводу?
Кстати postgre 7.3 (в 8 по моему есть какая-то фишка позволяющая new передать в execute)

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

На дворе версия 9.0.x уже,

На дворе версия 9.0.x уже, советую работать с ней.
По поводу самой задачи ничего не скажу - слишком специфично, надо сидеть и долго нудно пробовать все возможные варианты.

Не дають

Я бы с удовольствием! Только у нас все ПО сертифицируется, и как каждую версию это хлопотно (наверное).

Просто версия 7.x потеряла

Просто версия 7.x потеряла актуальность эдак лет 5 назад. В 9-ке много нового, более удобного, работает быстрее, подчищено много багов и т.д. Где вот мне например версию 7 взять для моей Fedora Linux 14? Такого старья у меня нет, проверять не на чем, подсказать вам в виду этого тоже затруднительно.

Вариант динамического запроса

Вариант динамического запроса в триггере не самая удачная идея, и потом зачем хранить исорию в базе если ее нельзя будет использовать, для задачи "на всякий случай" вполне подойдет сохранение информации во внешних файлах истории к примеру коммандой copy с периодическим запуском.

Если же информация все-таки будет использоваться то вполне можно использовать такой триггер

  IF tg_op='INSERT' then
  INSERT INTO log_ VALUES (tg_op, now(), user,  new.*); 
  RETURN new;
  elsif tg_op='UPDATE' then
  INSERT INTO log_ VALUES (tg_op, now(), user,  old.*); 
  RETURN old;
  elsif tg_op='DELETE' then
  INSERT INTO log_ VALUES (tg_op, now(), user, old.*); 
  RETURN old;

при этом структура таблицы лога должна соответствовать структуре основной таблицы, а поля "операция, дата, пользователь" в таблице логирования остаются неизменными.

Задача, собственно, вот в

Задача, собственно, вот в чем:
Одно подразделение разрабатывает базу, другое должно забирать из этой базы инфу и заливать к себе в базу. В обоих подразделениях разработка в самом разгаре (структуры меняют каждый день). Первое подразделение поручило мне разработать интерфейс передачи данных во второе.
Так как каждый день переписывать триггера не очень хочется я разбил все изменения на вставку объектов (их пара, тройка), которые собственно устаканились, и установку значений атрибутов для этих объектов (часть которая меняется). Заливая эти операции в лог я планировал отдавать их во второе подразделение, а там уж пусть делают что хотят. Таков был план. Я понимаю, что задача бестолковая, но все-таки....

Вопрос знатокам: при удалении

Вопрос знатокам: при удалении из таблицы поля, сработает ли триггер update этого поля?

для Вашей задачи чем не

для Вашей задачи чем не устраевает copy?

Цитата:
при удалении из таблицы поля, сработает ли триггер update этого поля?

-нет

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023