语句级触发器
创建语句级触发器,当添加学生时弹出“用户注册窗口”。
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引用某个列的值,要在前面加上“:”,在其他地方不能使用“:”。