如何在oracle中对特定列执行删除或更新触发?

如何在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上的任何更新执行

我想写一个触发器,每当发生删除或更新时,它会将旧数据复制到新表中

因此,我有两个表表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>