oracle - 如何在oracle中对特定列的删除或更新执行触发器?
问题描述
我想编写触发器,在删除或更新发生时将旧数据复制到新表中。
所以我有两个表tableA和tableB
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 中的一个触发器中执行此操作吗?
解决方案
是的,如果可以提供帮助。
这是一个基于 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>
推荐阅读
- c# - DateTime.AddHours 给出错误的输出和日期时间格式更改
- ios - 在 objc_object::release() 中崩溃
- java - 在java中实现以对象为参数的方法
- vector - 二进制补码向量 VHDL 的左移
- python - 合并两个镜像 Pandas 列
- google-cloud-platform - 达到配额限制之前的 StatusCode.RESOURCE_EXHAUSTED + 混乱的仪表板
- bitbucket - 将自定义链接添加到 Bitbucket 中的 pullrequest 页面
- ruby-on-rails - Rails 5.2 - 主动存储 - 太慢了?
- nginx - 如何阻止 nginx 将上游解析为 ip?
- sql - SQL 为每个维度的值插入所有不存在的记录