首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用调整后的旧/新值触发

使用调整后的旧/新值触发
EN

Stack Overflow用户
提问于 2020-09-29 04:55:25
回答 1查看 1.8K关注 0票数 0

我试着把触发器放在一起,它可以做多种事情:

在任何插入更新之前,

  • 会自动为插入的行列created_date和created_by,并将此行的更新值插入存档(历史)表

中。

在更新之前,

  • 会自动对更新行的edited_date和edited_by进行赋值,并将此更新行(包括更新的值edited_date和edited_by)插入存档表

中。

删除前的

  • .

如何使用调整后的新(或旧)值有效地编写前(或后)更新触发器?这里是我的触发器:

代码语言:javascript
复制
create trigger my_trigger
before insert or update or delete on my_table
for each row execute procedure my_function();

并在我想要使用更新的新行的地方使用:

代码语言:javascript
复制
create function my_function() returns trigger as $$ 
begin
  if (tg_op = 'INSERT') then 
    return 'something done here';
  elsif (tg_op = 'UPDATE') then 
    update NEW set edited_date = now(), edited_by = current_user;
    insert into my_table_hist select NEW.*;
  elsif (tg_op = 'DELETE') then 
    return 'something done here';
  end if;
  return null;
end;
$$ language plpgsql;

我的意思是,在update之前,我将新的行列更新为当前时间和当前用户,然后用更新的值将表更新到这个新行,最后,带有更新值的此行也被插入存档(历史记录)表中。但是它显然不是那样工作的,所以我应该如何重写这个触发器函数来使它工作呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-29 05:28:27

这里有很多问题:

  • 触发器函数必须返回一行,通常是(修改后的) NEW或NULL才能中止

操作

  • 您不更新NEW,因为它不是一个表,但是您分配给它的列,如

current_timestamp; NEW.created :=

  • BEFORE DELETE触发器NEW为空,因为没有新版本的行

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64113143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档