【问题标题】:Which SQL statement can I use to re-execute the trigger and update all the rows in a table?我可以使用哪个 SQL 语句重新执行触发器并更新表中的所有行?
【发布时间】:2009-03-21 03:18:07
【问题描述】:

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

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

谢谢。

【问题讨论】:

    标签: postgresql triggers


    【解决方案1】:

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

    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】:

      响应 FerranB 的回答,在 Postgres 中运行该函数的正确方法如下:

      SELECT function_on_trigger(column_id) FROM table;
      

      【讨论】:

        【解决方案3】:

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

        更新 [表格] 设置 [column_1] = [column_1]

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

        更新 [表格] 设置 [要更改的列] = [函数调用]

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

        【讨论】:

          猜你喜欢
          • 2012-07-04
          • 1970-01-01
          • 2013-05-13
          • 2010-09-29
          • 2013-12-11
          • 2012-02-02
          • 1970-01-01
          • 2021-10-13
          • 2021-05-29
          相关资源
          最近更新 更多