Какой оператор SQL можно использовать для повторного выполнения триггера и обновления всех строк в таблице? - PullRequest
1 голос
/ 19 марта 2009

У меня есть таблица с большим количеством строк, и я изменил функцию, связанную с триггером, в событиях вставки или обновления. Эта функция выполняет вычисления для обновления столбцов с условной логикой в ​​соответствии со значениями в двух или более ячейках, поэтому один оператор обновления не будет полезен.

Итак, какой оператор SQL можно использовать для повторного выполнения триггера и обновления всех строк?

Спасибо.

Ответы [ 3 ]

6 голосов
/ 19 марта 2009

Вы должны обновить столбец с точно таким же значением. Конечно это зависит от условий срабатывания. Например:

UPDATE table
  SET columnX = columnX;

В любом случае, в качестве передового опыта для этих случаев у меня обычно есть и связанная функция, в которой я могу запустить что-то вроде (не уверен, работает ли для progresql):

BEGIN
  for c in (select column_id from table)
  loop
    function_on_trigger(c.column_id);
  end loop;
END;
/
2 голосов
/ 20 марта 2009

В ответ на ответ FerranB правильный способ запуска функции в Postgres будет следующим:

SELECT function_on_trigger(column_id) FROM table;
0 голосов
/ 19 марта 2009

Для срабатывания триггера необходимо выполнить DML, который вызывает триггер, например, Я понимаю, в вашем случае выполнить обновление. Один из вариантов, который стоит рассмотреть, - выполнить обновление, которое на самом деле ничего не меняет. Я должен признать, что никогда не пробовал этого, но это будет первое, что я попробую (в тестовом экземпляре, конечно)

   Update [table]
   set [column_1] = [column_1]

В качестве альтернативы вы можете рассмотреть возможность прямого вызова функции в операторе обновления. Либо отключите триггер при этом, либо примите, что будет выполнено примерно вдвое больше работы, чем фактически требуется.

   update [table]
   set [column to change] = [function call]

Сначала протестируйте оба варианта в тестовом экземпляре или (не рекомендуется), скопировав таблицу (структуру и данные) и триггера в новую таблицу, а затем сначала выполните действие с новой таблицей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...