Oracle 触发器语法及实例(二)
2008-09-19 12:55:36 来源:WEB开发网2.6、例子:
需要对在表上进行DML操作的用户进行安全检查,看是否具有合适的特权。
Createtablefoo(anumber);
Createtriggerbiud_foo
Beforeinsertorupdateordelete
Onfoo
Begin
Ifusernotin(‘DONNY’)then
Raise_application_error(-20001,‘Youdon’thaveaccesstomodifythistable.’);
Endif;
End;
/
即使SYS,SYSTEM用户也不能修改foo表
2.7、[试验]
对修改表的时间、人物进行日志记录。
1、 建立试验表
createtableemployees_copyasselect*fromhr.employees
2、 建立日志表
createtableemployees_log(
whovarchar2(30),
whendate);
3、 在employees_copy表上建立语句触发器,在触发器中填充employees_log表。
Createorreplacetriggerbiud_employee_copy
Beforeinsertorupdateordelete
Onemployees_copy
Begin
Insertintoemployees_log(Who,when)
Values(user,sysdate);
End;
/
4、 测试
updateemployees_copysetsalary=salary*1.1;
select*fromemployess_log;
5、 确定是哪个语句起作用?
即是INSERT/UPDATE/DELETE中的哪一个触发了触发器?
可以在触发器中使用INSERTING / UPDATING / DELETING条件谓词,作判断:
begin
ifinsertingthen
-----
elsifupdatingthen
-----
elsifdeletingthen
------
endif;
end;
ifupdating(‘COL1’)orupdating(‘COL2’)then
------
endif;
2.8、[试验]
1、 修改日志表
altertableemployees_log
add(actionvarchar2(20));
2、 修改触发器,以便记录语句类型。
then
l_action:=’Delete’;
else
raise_application_error(-20001,’Youshouldneverevergetthiserror.’);
Insertintoemployees_log(Who,action,when)
Values(user,l_action,sysdate);
End;Createorreplacetriggerbiud_employee_copy
Beforeinsertorupdateordelete
Onemployees_copy
Declare
L_actionemployees_log.action%type;
Begin
ifinsertingthen
l_action:=’Insert’;
elsifupdatingthen
l_action:=’Update’;
elsifdeleting
/
3、测试
insertintoemployees_copy(employee_id,last_name,email,hire_date,job_id)
values(12345,’Chen’,’Donny@hotmail’,sysdate,12);
select*fromemployees_log
更多精彩
赞助商链接