如何解决使用调整后的OLD / NEW值进行触发
我正在尝试将触发多项操作的触发器放在一起:
-
在任何插入操作之前,将自动为插入的行更新created_date和created_by列,并将具有更新值的该行插入存档(历史记录)表中
-
在任何更新之前,会自动为已更新的行更新值edited_date和edited_by并将此已更新的行(包括已更新的值edited_date和edited_by)插入存档表
-
在删除之前...
如何使用调整后的NEW(或OLD)值有效地编写更新前或更新后的触发器?这是我的触发器:
create trigger my_trigger
before insert or update or delete on my_table
for each row execute procedure my_function();
我想在其中使用更新的新行的功能:
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;
我的意思是,在更新之前,我将NEW行列更新为当前时间和当前用户,然后将该表更新为具有更新值的该新行,最后将该具有更新值的行也插入到存档中(历史记录) )表。但这显然不能那样工作,那么我应该如何重写此触发函数以使其起作用?
解决方法
这里有很多不对劲:
-
触发函数必须返回一行(通常是(经修改的)
NEW
)或NULL才能终止操作 -
您不会更新
NEW
,因为它不是表,但是您将其分配给了列,例如NEW.created := current_timestamp;
-
用于
BEFORE DELETE
触发器NEW
为NULL,因为该行没有新版本
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。