代码之家  ›  专栏  ›  技术社区  ›  Alex. S.

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

  •  1
  • Alex. S.  · 技术社区  · 16 年前

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

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

    非常感谢。

    3 回复  |  直到 16 年前
        1
  •  12
  •   FerranB Tom    16 年前

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

    UPDATE table
      SET columnX = columnX;
    

    BEGIN
      for c in (select column_id from table)
      loop
        function_on_trigger(c.column_id);
      end loop;
    END;
    /
    
        2
  •  4
  •   Kenaniah    16 年前

    根据FerranB的回答,在Postgres中运行函数的正确方法如下:

    SELECT function_on_trigger(column_id) FROM table;
    
        3
  •  0
  •   Karl    16 年前

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

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

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

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

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