如何在oracle中对特定列执行删除或更新触发?
我想写一个触发器,每当发生删除或更新时,它会将旧数据复制到新表中 因此,我有两个表表A和表B 表格a具有以下属性:rollno、名称和状态 tableB具有以下属性:rollno、name 因此,首先,每当在tableA上执行删除操作时,我想将旧值复制到tableB,或者第二,每当tableA上的status属性的值更改为特定值(如“C”)时,我也必须复制旧值 我编写了一个触发器,每当执行删除或更新时,它都会将旧值从tableA复制到tableB中,但触发器也会针对tableA上的任何更新执行 这是我的触发码如何在oracle中对特定列执行删除或更新触发?,oracle,plsql,triggers,database-trigger,oracle11gr2,Oracle,Plsql,Triggers,Database Trigger,Oracle11gr2,我想写一个触发器,每当发生删除或更新时,它会将旧数据复制到新表中 因此,我有两个表表A和表B 表格a具有以下属性:rollno、名称和状态 tableB具有以下属性:rollno、name 因此,首先,每当在tableA上执行删除操作时,我想将旧值复制到tableB,或者第二,每当tableA上的status属性的值更改为特定值(如“C”)时,我也必须复制旧值 我编写了一个触发器,每当执行删除或更新时,它都会将旧值从tableA复制到tableB中,但触发器也会针对tableA上的任何更新执行
create or replace trigger my_trigger
before delete or update
on tableA
for each row
begin
insert into tableB values(:OLD.rollno,:OLD.name);
end;
那么,如果状态属性被更新,如何执行触发器呢?
我可以通过在触发器中使用if语句来检查:NEW值是否为'c',然后执行触发器,但我还想执行delete语句的触发器。我如何才能做到这一点
我想我可以使用两个触发器,一个用于删除,一个用于更新,内部更新触发器我可以检查我的状态,但我可以在oracle中仅在一个触发器中执行此操作吗?您可以按以下方式执行此操作:
create or replace trigger my_trigger
before delete or update of status
on tableA
for each row
WHEN (NEW.status= 'C' OR NEW.status IS NULL)
begin
insert into tableB values(:OLD.rollno,:OLD.name);
end;
仅使用updateofstatus
查找列状态的更新。然后仅当新列值与某些条件匹配时执行触发器(new.status='C'或new.status为NULL)检查您的值或NULL(在delete情况下)。是,如果可以提供帮助
下面是一个基于Scott模式的示例;看一看
这是一个日志表:
触发:
SQL> create or replace trigger trg_bdu_dept
2 before delete or update on dept
3 for each row
4 begin
5 if deleting then
6 insert into deptb values (:old.deptno, :old.dname, :old.loc);
7 elsif updating and :old.loc = 'NEW YORK' then
8 insert into deptb values (:old.deptno, :old.dname, :old.loc);
9 end if;
10 end;
11 /
Trigger created.
SQL>
测试:
SQL> select * from dept;
DEPTNO DNAME LOC
---------- -------------------- --------------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> delete from dept where deptno = 40;
1 row deleted.
SQL> update dept set loc = 'NY' where loc = 'NEW YORK';
1 row updated.
SQL> update dept set loc = 'dallas' where loc = 'DALLAS';
1 row updated.
SQL> select * from deptb;
DEPTNO DNAME LOC
---------- -------------------- --------------------
40 OPERATIONS BOSTON
10 ACCOUNTING NEW YORK
SQL> select * from dept;
DEPTNO DNAME LOC
---------- -------------------- --------------------
10 ACCOUNTING NY
20 RESEARCH dallas
30 SALES CHICAGO
SQL>
它向我抛出了一个错误:在表A*第3行的错误:ORA-04079:无效的触发器规格如果它有帮助,我很高兴。
SQL> select * from dept;
DEPTNO DNAME LOC
---------- -------------------- --------------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> delete from dept where deptno = 40;
1 row deleted.
SQL> update dept set loc = 'NY' where loc = 'NEW YORK';
1 row updated.
SQL> update dept set loc = 'dallas' where loc = 'DALLAS';
1 row updated.
SQL> select * from deptb;
DEPTNO DNAME LOC
---------- -------------------- --------------------
40 OPERATIONS BOSTON
10 ACCOUNTING NEW YORK
SQL> select * from dept;
DEPTNO DNAME LOC
---------- -------------------- --------------------
10 ACCOUNTING NY
20 RESEARCH dallas
30 SALES CHICAGO
SQL>