我可以使用哪个SQL语句重新执行触发器并更新表中的所有行?

时间:2009-03-19 20:23:31

标签: postgresql triggers

我有一个包含很多行的表,我在插入或更新事件中更改了与触发器关联的功能。此函数根据两个或多个单元格中的值进行计算以使用条件逻辑更新列,因此单个更新语句将无用。

那么,我可以使用哪个SQL语句重新执行触发器并更新所有行?

谢谢。

3 个答案:

答案 0 :(得分:6)

您必须使用完全相同的值更新列。当然这取决于触发条件。例如:

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;
/

答案 1 :(得分:2)

回应FerranB的回答,在Postgres中运行该功能的正确方法如下:

SELECT function_on_trigger(column_id) FROM table;

答案 2 :(得分:0)

为了触发触发器,您必须执行调用触发器的DML,例如我理解你的情况下执行更新。要考虑的一个选项是执行实际上不会更改任何内容的更新。我必须承认我从来没有尝试过,但这将是我尝试的第一件事(当然是在测试实例中)

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

或者,您可以考虑直接在update语句中调用该函数。在执行此操作时禁用触发器或接受将按实际需要完成大约两倍的工作。

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

首先在测试实例或(不推荐的方法)中测试两个选项,方法是将表(结构和数据)和触发器复制到新表并首先对新表执行操作。