首页 > 解决方案 > 如何在oracle中对特定列的删除或更新执行触发器?

问题描述

我想编写触发器,在删除或更新发生时将旧数据复制到新表中。

所以我有两个表tableAtableB

tableA具有以下属性:rollno、name 和 status

tableB具有以下属性:rollno、name

因此,首先,每当对 tableA 进行删除操作时,我想将旧值复制到 tableB 或第二个每当 tableA 上的状态属性的值更改为特定值时说“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;

那么如果status属性更新了,如何执行trigger呢?我可以通过在触发器中使用 if 语句来检查:NEW 值是否为 'c' 然后执行触发器,但我也想执行 delete 语句的触发器,我该怎么做?

我想我可以使用两个触发器,一个用于删除,一个用于更新,在更新触发器内部我可以检查我的条件,但我只能在 oracle 中的一个触发器中执行此操作吗?

标签: oracleplsqltriggersdatabase-triggeroracle11gr2

解决方案


是的,如果可以提供帮助。

这是一个基于 Scott 模式的示例;看一看。

这是一个日志表:

SQL> create table deptb as select * From dept where 1 = 2;

Table created.

扳机:

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>

推荐阅读