如何根据同一个表中的其他列更改更新列值,而不使用表中的任何主键列

时间:2017-07-11 16:11:00

标签: postgresql triggers plpgsql postgresql-9.3

我有一张名为' custom_manual_edit'使用列' name',' 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 个答案:

答案 0 :(得分:0)

请查看文档:{​​{3}}

  

每个语句触发器调用的触发器函数应始终使用   返回NULL。每行触发器调用的触发器函数可以返回   调用执行程序的表行(类型为HeapTuple的值)if   他们选择。 在操作具有之前触发的行级触发器   以下选择

     
      
  • 它可以返回NULL以跳过当前行的操作。这个   指示执行程序不执行该行级操作   调用触发器(插入,修改或删除)   特别的表格行。)

  •   
  • 仅对于行级INSERT和UPDATE触发器,返回的行   成为将要插入的行或将替换正在行的行   更新。这允许触发器功能修改行   插入或更新。

  •   
     

不打算导致其中任何一个的行级BEFORE触发器   这些行为必须小心返回,因为它的结果是同一行   传入的(即INSERT和UPDATE的NEW行)   触发器,DELETE触发器的OLD行)。

根据以上所述,您必须:

  1. 将触发器声明为 BEFORE UPDATE ,而不是AFTER UPDATE
  2. 直接在新行中更改builder_edit_flag列值 ,而不是触发UPDATE语句
  3. 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;
    .....
    .....