Oracle--DML触发器

不羁岁月 提交于 2020-01-06 14:36:50

语句级触发器

创建语句级触发器,当添加学生时弹出“用户注册窗口”。

create or replace trigger tr_student
before insert on student
begin
  dbms_output.put_line('欢迎新同学!');
end;

执行:

在这里插入图片描述

利用触发器实现日志管理功能。该触发器用来实现当在Student表中删除一条数据时,在stu_log表中添加一条包含当前操作用户(USER)和当前操作日期(SYSDATE)的记录

创建日志表:

create table stu_log(
 WHO varchar2(20),
 WHEN DATE);

创建触发器:

create or replace trigger tr_stu_log
after delete
on student
begin 
  insert into stu_log values(USER,SYSDATE);
end;

测试:
在这里插入图片描述

行级触发器

如果在某个表上创建了一个触发器,在对这个表进行DML操作时,每当影响一行数据,该触发器都将被激发执行一次,那么这个触发器就是行级触发器。

在行级触发器中有一个很重要的特点,当创建BEFORE行级触发器时,可以在触发器中引用受到影响的行值,甚至可以用在触发器中设置它们。

创建一个简单的行级触发器,如果对表Student进行DELETE操作,每删除一条符合条件的记录,就显示一次字符串“1行已经被删除”。

create or replace trigger tr_stu_del
after delete
on student
for each row
declare
begin
  dbms_output.put_line('1行已经被删除!');
end;

测试:
在这里插入图片描述

需要注意的是,在创建行级触发器时,可以指定一些条件,这样只有当特定的数据受到DML影响时,触发器才被执行。创建触发器时,可以在FOR EACH ROW子句之后使用WHEN子句指定条件。

重新编写上面例子的触发器,要求对SNAME为“张三”进行监视,只有当从表Student中删除SNAME列值为‘张三’的行时,才激发触发器。

create or replace trigger tr_stu_del
after delete
on student
for each row when(old.SNAME='张三')
declare
begin
  dbms_output.put_line('1行已经被删除!');
end;

测试:
在这里插入图片描述

在行级触发器中,同样可以使用条件谓词INSERT、UPDATING和DELETING,以判断当前所进行的DML操作。行级触发器通常用于对用户的DML操作进行合法性检查,使得用户修改数据的操作必须按照一定的规则进行。

为了能够比较修改前和修改后的数据,在触发器的可执行代码中,可以使用两个关联行——NEW和OLD。它们为别表示触发器被激发时,当前行的原数据和新数据。:NEW和:OLD也称之为系统变量,由Oracle系统管理,存储在内存中,不允许用户直接对其进行修改。:NEW和:OLD变量的结构总是与执行DML操作的表的结构相同。当触发器工作完成以后,这两个变量也随之消失。这两个变量的值是只读的,即用户不能向这两个变量写入内容,但可以引用变量中的数据。

  • :OLD 变量用于DELETE和UPDATE操作所影响的行的副本。当执行DELETE或UPDATE操作时,行从触发表中被删除,并传输到:OLD变量中。
  • :NEW 变量用户存储INSERT和UPDATE操作所影响的行的副本。当执行INSERT或UPDATE操作时,新行被添加到:NEW变量和触发表中,:NEW变量中的行即为触发表中新行的副本。

另外,需要注意的是,在触发器的可执行代码中,如果要通过OLD和NEW引用某个列的值,要在前面加上“:”,在其他地方不能使用“:”。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!