当其中一列的值更新时,我需要将数据从一个表移动到另一个表。我只想将更新后的行移到新表中。
下面是我写的触发器。我的代码的问题是,它移动的是所有数据,而不仅仅是更新的行。有人能提个建议吗?
create or replace function moveToAC1ControlHist()
returns trigger as $$
begin if NEW.file_status='CO'
then
insert into ac1_control_hist (file_status,identitifier)
(
select file_status,identitifier
from
ac1_control where new.FILE_STATUS = 'CO'
);
end if;
return new;
end;
$$ language plpgsql;
create TRIGGER AC1_CONTROL_TRIGGER AFTER update of file_status ON AC1_CONTROL
FOR EACH ROW when (new.file_status ='CO')EXECUTE PROCEDURE moveToAC1ControlHist();
我认为您想要的逻辑是:
create or replace function moveToAC1ControlHist()
returns trigger as
$$
begin
insert into ac1_control_hist (file_status,identitifier)
values (new.file_status, new.identitifier);
return null;
end;
$$ language plpgsql;
create trigger ac1_control_trigger
after update of file_status on ac1_control
for each row
when (new.file_status ='co')
execute function movetoac1controlhist()
;
理由:
您只想复制(部分(正在更新的行,因此不需要
select
;您可以使用行级触发器中的new
访问当前行的值触发器定义过滤等于
'CO'
的新file_status
,因此在函数中不需要if
构造这是一个
after
触发器,所以您可以只返回null
-结果无论如何都会被丢弃