通过单个触发功能更新多个表的当前时间戳

时间:2018-08-21 13:42:24

标签: postgresql triggers

我创建了2个表:-表银行和分支机构。这两个表都有last_updated列(这意味着记录最后一次更新的时间。)我在更新触发器之后为两个表中的每一行创建了一个。触发和触发功能如下所示:-

create trigger banks_upd_trg
after update of phone_no
on Banks
FOR EACH ROW
EXECUTE PROCEDURE bankdetails_upd();

create trigger branch_upd_trg
after update of email_address
on Branch
FOR EACH ROW
EXECUTE PROCEDURE bankdetails_upd();


create or replace FUNCTION bankdetails_upd()
  RETURNS trigger AS
$BODY$

BEGIN 

EXECUTE format('update %I.%I SET last_updated=current_timestamp where id=new.id',TG_SHEMA_NAME,TG_TABLE_NAME)

RETURN NEW;

END;
$BODY$
  LANGUAGE plpgsql

触发器已成功执行,但在分别更新“银行”和“分支机构”表中的phone_no和email_address列时不起作用。

1 个答案:

答案 0 :(得分:1)

不需要动态SQL或UPDATE语句。

使用before触发器并将值分配给NEW记录。

create or replace FUNCTION bankdetails_upd()
  RETURNS trigger AS
$BODY$

BEGIN 
  new.last_updated := current_timestamp; 
  RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;
create trigger banks_upd_trg
BEFORE update of phone_no
on Banks
FOR EACH ROW
EXECUTE PROCEDURE bankdetails_upd();

create trigger branch_upd_trg
BEFORE update of email_address
on Branch
FOR EACH ROW
EXECUTE PROCEDURE bankdetails_upd();