Oracle触发器详细介绍(二)
文章作者 100test 发表时间 2007:03:14 13:45:55
来源 100Test.Com百考试题网
1、 语句触发器
是在表上或者某些情况下的视图上执行的特定语句或者语句组上的触发器。能够与INSERT、UPDATE、DELETE或者组合上进行关联。但是无论使用什么样的组合,各个语句触发器都只会针对指定语句激活一次。比如,无论0update多少行,也只会调用一次0update语句触发器。
例子:
需要对在表上进行DML操作的用户进行安全检查,看是否具有合适的特权。
Create table foo(a number).
Create trigger biud_foo
Before insert or 0update or 0delete
On foo
Begin
If user not in (‘DONNY’) then
Raise_application_error(-20001, ‘You don’t have access to modify this table.’).
End if.
End.
/
即使SYS,SYSTEM用户也不能修改foo表
[试验]
对修改表的时间、人物进行日志记录。
1、 建立试验表
create table employees_copy as 0select *from hr.employees
2、 建立日志表
create table employees_log(
who varchar2(30),
when date).
3、 在employees_copy表上建立语句触发器,在触发器中填充employees_log 表。
Create or replace trigger biud_employee_copy
Before insert or 0update or 0delete
On employees_copy
Begin
Insert into employees_log(
Who,when)
Values( user, sysdate).
End.
/
4、 测试
0update employees_copy set salary= salary*1.1.
0select *from employess_log.
5、 确定是哪个语句起作用?
即是INSERT/UPDATE/DELETE中的哪一个触发了触发器?
可以在触发器中使用INSERTING / UPDATING / DELETING 条件谓词,作判断:
begin
if inserting then
-----
elsif updating then
-----
elsif deleting then
------
end if.
end.
if updating(‘COL1’) or updating(‘COL2’) then
------
end if.
[试验]
1、 修改日志表
alter table employees_log
add (action varchar2(20)).
2、 修改触发器,以便记录语句类型。
Create or replace trigger biud_employee_copy
Before insert or 0update or 0delete
On employees_copy
Declare
L_action employees_log.action%type.
Begin
if inserting then
l_action:=’Insert’.
elsif updating then
l_action:=’Update’.
elsif deleting then
l_action:=’Delete’.
else
raise_application_error(-20001,’You should never ever get this error.’).
Insert into employees_log(
Who,action,when)
Values( user, l_action,sysdate).
End.
/
3、 测试
insert into employees_copy( employee_id, last_name, email, hire_date, job_id)
values(12345,’Chen’,’Donny@hotmail’,sysdate,12).
0select *from employees_log