WEB开发网
开发学院数据库Oracle Oracle 触发器语法及实例(二) 阅读

Oracle 触发器语法及实例(二)

 2008-09-19 12:55:36 来源:WEB开发网   
核心提示: 2.6、例子:需要对在表上进行DML操作的用户进行安全检查,看是否具有合适的特权,Oracle 触发器语法及实例(二)(3),Createtablefoo(anumber);Createtriggerbiud_fooBeforeinsertorupdateordeleteOnfooBegi

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

上一页  1 2 3 

Tags:Oracle 触发器 语法

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接