代码之家  ›  专栏  ›  技术社区  ›  Harnish Kumar

如何基于同一表中其他列的更改更新列值,而表中没有任何主键列

  •  3
  • Harnish Kumar  · 技术社区  · 8 年前

    我有一个名为“custom\u manual\u edit”的表,其中包含“name”、“builder”和“flag”列,其中没有包含主键的列。当用户更新builder列中的任何更改时,我编写了一个触发器,该触发器将调用一个函数,该函数应将builder值更改的记录的标志列值更新为10 下面是我的触发器

    CREATE TRIGGER builder_update_trigger_manual_custom_edits
    AFTER UPDATE
    ON edmonton.custom_manual_edit
    FOR EACH ROW
    WHEN (((old.builder)::text IS DISTINCT FROM (new.builder)::text))
    EXECUTE PROCEDURE 
    edmonton.automated_builder_update_trigger_manual_custom_edits();
    

    和我的功能

      CREATE OR REPLACE FUNCTION 
    edmonton.automated_builder_update_trigger_manual_custom_edits()
    RETURNS trigger AS
    $BODY$
    DECLARE
    e record;
    
    BEGIN
    IF NEW.builder <> OLD.builder THEN
        EXECUTE FORMAT('UPDATE edmonton.custom_manual_edit set builder_edit_flag = 10;
    END IF;
    RETURN NEW;
    
     END 
     $BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100;
    

    我知道这会将整个表标志列更新为10,但如何更新生成器值已更改的记录的标志值。

    1 回复  |  直到 8 年前
        1
  •  3
  •   krokodilko    8 年前

    请检查文档: 36.1. Overview of Trigger Behavior

    每语句触发器调用的触发器函数应始终 返回NULL。每行触发器调用的触发器函数可以返回 他们选择。 在操作具有 :

    • 它可以返回NULL以跳过当前行的操作。这 调用触发器(插入、修改或删除 特定表格行)。

    • 返回的行 已更新。这允许触发器函数修改正在执行的行

    触发器之前的行级别,不打算导致 这些行为必须小心,以作为其结果返回同一行 触发器,删除触发器的旧行)。

    1. 将触发器声明为 更新前
    2. 改变 builder_edit_flag

    CREATE TRIGGER builder_update_trigger_manual_custom_edits
    BEFORE UPDATE
    ON edmonton.custom_manual_edit
    FOR EACH ROW
    .....
    .....
    

    CREATE OR REPLACE FUNCTION 
    edmonton.automated_builder_update_trigger_manual_custom_edits()
    .....
    .....
    
    BEGIN
    IF NEW.builder <> OLD.builder THEN
        NEW.builder_edit_flag = 10;
    END IF;
    RETURN NEW;
    .....
    .....