当前位置:Gxlcms > 数据库问题 > Oracle数据库之PL/SQL触发器

Oracle数据库之PL/SQL触发器

时间:2021-07-01 10:21:17 帮助过:3人阅读

CREATE [ OR REPLACE ] TRIGGER plsql_trigger_source 

  1. <span style="color: #008080;"> 1</span> plsql_trigger_source ::<span style="color: #808080;">========</span>
  2. <span style="color: #008080;"> 2</span>
  3. <span style="color: #008080;"> 3</span> <span style="color: #ff0000;">[</span><span style="color: #ff0000;">schema.</span><span style="color: #ff0000;">]</span><span style="color: #000000;"> trigger_name
  4. </span><span style="color: #008080;"> 4</span> <span style="color: #000000;"> { simple_dml_trigger
  5. </span><span style="color: #008080;"> 5</span> <span style="color: #808080;">|</span><span style="color: #000000;"> instead_of_dml_trigger
  6. </span><span style="color: #008080;"> 6</span> <span style="color: #808080;">|</span><span style="color: #000000;"> compound_dml_trigger
  7. </span><span style="color: #008080;"> 7</span> <span style="color: #808080;">|</span><span style="color: #000000;"> system_trigger
  8. </span><span style="color: #008080;"> 8</span> <span style="color: #000000;"> }
  9. </span><span style="color: #008080;"> 9</span>
  10. <span style="color: #008080;">10</span> simple_dml_trigger ::<span style="color: #808080;">========</span>
  11. <span style="color: #008080;">11</span>
  12. <span style="color: #008080;">12</span> { BEFORE <span style="color: #808080;">|</span> AFTER } dml_event_clause <span style="color: #ff0000;">[</span><span style="color: #ff0000;"> referencing_clause </span><span style="color: #ff0000;">]</span> <span style="color: #ff0000;">[</span><span style="color: #ff0000;"> FOR EACH ROW </span><span style="color: #ff0000;">]</span>
  13. <span style="color: #008080;">13</span> <span style="color: #ff0000;">[</span><span style="color: #ff0000;"> trigger_edition_clause </span><span style="color: #ff0000;">]</span> <span style="color: #ff0000;">[</span><span style="color: #ff0000;"> trigger_ordering_clause </span><span style="color: #ff0000;">]</span>
  14. <span style="color: #008080;">14</span> <span style="color: #ff0000;">[</span><span style="color: #ff0000;"> ENABLE | DISABLE </span><span style="color: #ff0000;">]</span> <span style="color: #ff0000;">[</span><span style="color: #ff0000;"> WHEN ( condition ) </span><span style="color: #ff0000;">]</span><span style="color: #000000;"> trigger_body
  15. </span><span style="color: #008080;">15</span>
  16. <span style="color: #008080;">16</span> instead_of_dml_trigger ::<span style="color: #808080;">=</span>
  17. <span style="color: #008080;">17</span>
  18. <span style="color: #008080;">18</span> INSTEAD <span style="color: #0000ff;">OF</span> { <span style="color: #0000ff;">DELETE</span> <span style="color: #808080;">|</span> <span style="color: #0000ff;">INSERT</span> <span style="color: #808080;">|</span> <span style="color: #0000ff;">UPDATE</span> } <span style="color: #ff0000;">[</span><span style="color: #ff0000;"> OR { DELETE | INSERT | UPDATE } </span><span style="color: #ff0000;">]</span><span style="color: #000000;">...
  19. </span><span style="color: #008080;">19</span> <span style="color: #0000ff;">ON</span> <span style="color: #ff0000;">[</span><span style="color: #ff0000;"> NESTED TABLE nested_table_column OF </span><span style="color: #ff0000;">]</span> <span style="color: #ff0000;">[</span><span style="color: #ff0000;"> schema. </span><span style="color: #ff0000;">]</span><span style="color: #000000;"> noneditioning_view
  20. </span><span style="color: #008080;">20</span> <span style="color: #ff0000;">[</span><span style="color: #ff0000;"> referencing_clause </span><span style="color: #ff0000;">]</span> <span style="color: #ff0000;">[</span><span style="color: #ff0000;"> FOR EACH ROW </span><span style="color: #ff0000;">]</span>
  21. <span style="color: #008080;">21</span> <span style="color: #ff0000;">[</span><span style="color: #ff0000;"> trigger_edition_clause </span><span style="color: #ff0000;">]</span> <span style="color: #ff0000;">[</span><span style="color: #ff0000;"> trigger_ordering_clause </span><span style="color: #ff0000;">]</span>
  22. <span style="color: #008080;">22</span> <span style="color: #ff0000;">[</span><span style="color: #ff0000;"> ENABLE | DISABLE </span><span style="color: #ff0000;">]</span><span style="color: #000000;"> trigger_body
  23. </span><span style="color: #008080;">23</span>
  24. <span style="color: #008080;">24</span> system_trigger ::<span style="color: #808080;">=======</span>
  25. <span style="color: #008080;">25</span>
  26. <span style="color: #008080;">26</span> { BEFORE <span style="color: #808080;">|</span> AFTER <span style="color: #808080;">|</span> INSTEAD <span style="color: #0000ff;">OF</span><span style="color: #000000;"> }
  27. </span><span style="color: #008080;">27</span> { ddl_event <span style="color: #ff0000;">[</span><span style="color: #ff0000;">OR ddl_event</span><span style="color: #ff0000;">]</span><span style="color: #000000;">...
  28. </span><span style="color: #008080;">28</span> <span style="color: #808080;">|</span> database_event <span style="color: #ff0000;">[</span><span style="color: #ff0000;">OR database_event</span><span style="color: #ff0000;">]</span><span style="color: #000000;">...
  29. </span><span style="color: #008080;">29</span> <span style="color: #000000;">}
  30. </span><span style="color: #008080;">30</span> <span style="color: #0000ff;">ON</span> { <span style="color: #ff0000;">[</span><span style="color: #ff0000;">schema.</span><span style="color: #ff0000;">]</span> <span style="color: #0000ff;">SCHEMA</span>
  31. <span style="color: #008080;">31</span> <span style="color: #808080;">|</span> <span style="color: #0000ff;">DATABASE</span>
  32. <span style="color: #008080;">32</span> <span style="color: #000000;"> }
  33. </span><span style="color: #008080;">33</span> <span style="color: #ff0000;">[</span><span style="color: #ff0000;"> trigger_ordering clause </span><span style="color: #ff0000;">]</span>
  34. <span style="color: #008080;">34</span>
  35. <span style="color: #008080;">35</span> dml_event_clause ::<span style="color: #808080;">============</span>
  36. <span style="color: #008080;">36</span>
  37. <span style="color: #008080;">37</span> { <span style="color: #0000ff;">DELETE</span> <span style="color: #808080;">|</span> <span style="color: #0000ff;">INSERT</span> <span style="color: #808080;">|</span> <span style="color: #0000ff;">UPDATE</span> <span style="color: #ff0000;">[</span><span style="color: #ff0000;"> OF column [, column </span><span style="color: #ff0000;">]</span><span style="color: #000000;">... ] }
  38. </span><span style="color: #008080;">38</span> <span style="color: #ff0000;">[</span><span style="color: #ff0000;"> OR { DELETE | INSERT | UPDATE [ OF column [, column</span><span style="color: #ff0000;">]</span><span style="color: #000000;">... ] }...
  39. </span><span style="color: #008080;">39</span> <span style="color: #0000ff;">ON</span> <span style="color: #ff0000;">[</span><span style="color: #ff0000;"> schema.</span><span style="color: #ff0000;">]</span> { <span style="color: #0000ff;">table</span> <span style="color: #808080;">|</span> <span style="color: #0000ff;">view</span><span style="color: #000000;"> }
  40. </span><span style="color: #008080;">40</span>
  41. <span style="color: #008080;">41</span> referencing_clause ::<span style="color: #808080;">==========</span>
  42. <span style="color: #008080;">42</span>
  43. <span style="color: #008080;">43</span> <span style="color: #000000;">REFERENCING
  44. </span><span style="color: #008080;">44</span> { OLD <span style="color: #ff0000;">[</span><span style="color: #ff0000;"> AS </span><span style="color: #ff0000;">]</span><span style="color: #000000;"> old
  45. </span><span style="color: #008080;">45</span> <span style="color: #808080;">|</span> NEW <span style="color: #ff0000;">[</span><span style="color: #ff0000;"> AS </span><span style="color: #ff0000;">]</span><span style="color: #000000;"> new
  46. </span><span style="color: #008080;">46</span> <span style="color: #808080;">|</span> PARENT <span style="color: #ff0000;">[</span><span style="color: #ff0000;"> AS </span><span style="color: #ff0000;">]</span><span style="color: #000000;"> parent
  47. </span><span style="color: #008080;">47</span> <span style="color: #000000;"> }...
  48. </span><span style="color: #008080;">48</span>
  49. <span style="color: #008080;">49</span> trigger_body ::<span style="color: #808080;">=======</span>
  50. <span style="color: #008080;">50</span>
  51. <span style="color: #008080;">51</span> { plsql_block <span style="color: #808080;">|</span> CALL routine_clause }

 

 

说明:

BEFORE和AFTER指出触发器的触发时间分别为前触发和后触发方式,前触发是在执行触发事件之前触发当前所创建的触发器,后触发是在执行触发事件之后触发当前所创建的触发器。

REFERENCING子句说明相关名称,在行触发器的PL/SQL块和WHEN子句中可以使用相关名称参照当前的新、旧列值,默认的相关名称为OLD和NEW。触发器的PL/SQL块中应用相关名称时,必须在它们之前加冒号(:),但在WHEN子句中则不能加冒号。

NEW只在UPDATE、INSERT的DML触发器内可用,它包含了修改发生后被影响行的值。

OLD只在UPDATE、DELETE的DML触发器内可用,它包含了修改发生前被影响行的值。

FOR EACH ROW选项说明触发器为行触发器。行触发器和语句触发器的区别表现在:行触发器要求当一个DML语句操走影响数据库中的多行数据时,对于其中的每个数据行,只要它们符合触发约束条件,均激活一次触发器;而语句触发器将整个语句操作作为触发事件,当它符合约束条件时,激活一次触发器。当省略FOR EACH ROW 选项时,BEFORE和AFTER触发器为语句触发器,而INSTEAD OF触发器则只能为行触发器。

WHEN子句说明触发约束条件。Condition为一个逻辑表达时,其中必须包含相关名称,而不能包含查询语句,也不能调用PL/SQL函数。WHEN子句指定的触发约束条件只能用在BEFORE和AFTER行触发器中,不能用在INSTEAD OF行触发器和其它类型的触发器中。

INSTEAD OF选项(创建替代触发器)使ORACLE激活触发器,而不执行触发事件。只能对视图和对象视图建立INSTEAD OF触发器,而不能对表、模式和数据库建立INSTEAD OF触发器。

ddl_event:一个或多个DDL事件,事件间用OR分开。

database_event:一个或多个数据库事件,事件间用OR分开。

示例1,在插入数据时,自动使用序列编号:

  1. <span style="color: #008080;">1</span> <span style="color: #0000ff;">CREATE</span> <span style="color: #808080;">OR</span> <span style="color: #ff00ff;">REPLACE</span> <span style="color: #0000ff;">TRIGGER</span><span style="color: #000000;"> EMP_INSERT_ID
  2. </span><span style="color: #008080;">2</span> BEFORE <span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">ON</span> employee <span style="color: #0000ff;">FOR</span><span style="color: #000000;"> EACH ROW
  3. </span><span style="color: #008080;">3</span> <span style="color: #0000ff;">BEGIN</span>
  4. <span style="color: #008080;">4</span> <span style="color: #0000ff;">SELECT</span> SEQ_ID.NEXTVAL <span style="color: #0000ff;">INTO</span> :NEW.ID <span style="color: #0000ff;">FROM</span><span style="color: #000000;"> DUAL;
  5. </span><span style="color: #008080;">5</span> <span style="color: #0000ff;">END</span>;
  1. <span style="color: #008080;"> 1</span> <span style="color: #000000;">示例2,在多表联接的视图中插入数据:
  2. </span><span style="color: #008080;"> 2</span>
  3. <span style="color: #008080;"> 3</span> <span style="color: #008080;">--</span><span style="color: #008080;"> 创建视图</span>
  4. <span style="color: #008080;"> 4</span> <span style="color: #0000ff;">CREATE</span> <span style="color: #808080;">OR</span> <span style="color: #ff00ff;">REPLACE</span> <span style="color: #0000ff;">VIEW</span> vw_emp <span style="color: #0000ff;">AS</span>
  5. <span style="color: #008080;"> 5</span> <span style="color: #0000ff;">SELECT</span><span style="color: #000000;"> e.name ename, e.address, d.name dname
  6. </span><span style="color: #008080;"> 6</span> <span style="color: #0000ff;">FROM</span><span style="color: #000000;"> employee e, dept d
  7. </span><span style="color: #008080;"> 7</span> <span style="color: #0000ff;">WHERE</span> e.did <span style="color: #808080;">=</span><span style="color: #000000;"> d.id;
  8. </span><span style="color: #008080;"> 8</span>
  9. <span style="color: #008080;"> 9</span> <span style="color: #008080;">--</span><span style="color: #008080;"> 创建触发器</span>
  10. <span style="color: #008080;">10</span> <span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">TRIGGER</span><span style="color: #000000;"> emp_insert_trigger
  11. </span><span style="color: #008080;">11</span> INSTEAD <span style="color: #0000ff;">OF</span> <span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">ON</span><span style="color: #000000;"> vw_emp
  12. </span><span style="color: #008080;">12</span> <span style="color: #0000ff;">DECLARE</span>
  13. <span style="color: #008080;">13</span> v_did dept.id<span style="color: #808080;">%</span><span style="color: #000000;">TYPE;
  14. </span><span style="color: #008080;">14</span> <span style="color: #0000ff;">BEGIN</span>
  15. <span style="color: #008080;">15</span> <span style="color: #0000ff;">SELECT</span> id <span style="color: #0000ff;">INTO</span> v_did <span style="color: #0000ff;">FROM</span> dept <span style="color: #0000ff;">WHERE</span> name <span style="color: #808080;">=</span><span style="color: #000000;"> :NEW.dname;
  16. </span><span style="color: #008080;">16</span> <span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> emp (name, address, did) <span style="color: #0000ff;">VALUES</span><span style="color: #000000;"> (:NEW.ename, :NEW.address, v_did);
  17. </span><span style="color: #008080;">17</span> <span style="color: #0000ff;">END</span> emp_insert_trigger;

 

 

  1. <span style="color: #008080;"> 1</span> <span style="color: #000000;">示例3,创建实例启动触发器:
  2. </span><span style="color: #008080;"> 2</span>
  3. <span style="color: #008080;"> 3</span> <span style="color: #008080;">--</span><span style="color: #008080;"> 创建记录操作事件的表</span>
  4. <span style="color: #008080;"> 4</span> <span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">TABLE</span><span style="color: #000000;"> event_table(
  5. </span><span style="color: #008080;"> 5</span> event <span style="color: #0000ff;">VARCHAR2</span>(<span style="color: #800000; font-weight: bold;">50</span><span style="color: #000000;">),
  6. </span><span style="color: #008080;"> 6</span> <span style="color: #000000;"> time DATE
  7. </span><span style="color: #008080;"> 7</span> <span style="color: #000000;">);
  8. </span><span style="color: #008080;"> 8</span>
  9. <span style="color: #008080;"> 9</span> <span style="color: #008080;">--</span><span style="color: #008080;"> 创建触发器</span>
  10. <span style="color: #008080;">10</span> <span style="color: #0000ff;">CREATE</span> <span style="color: #808080;">OR</span> <span style="color: #ff00ff;">REPLACE</span> <span style="color: #0000ff;">TRIGGER</span><span style="color: #000000;"> tr_startup
  11. </span><span style="color: #008080;">11</span> <span style="color: #000000;"> AFTER STARTUP
  12. </span><span style="color: #008080;">12</span> <span style="color: #0000ff;">ON</span> <span style="color: #0000ff;">DATABASE</span>
  13. <span style="color: #008080;">13</span> <span style="color: #0000ff;">BEGIN</span>
  14. <span style="color: #008080;">14</span> <span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span><span style="color: #000000;"> event_table(event, time)
  15. </span><span style="color: #008080;">15</span> <span style="color: #0000ff;">VALUES</span><span style="color: #000000;">(ora_sysevent, SYSDATE);
  16. </span><span style="color: #008080;">16</span> <span style="color: #0000ff;">END</span>;

 

 

 DML触发器

DML触发器对我们开发人员来说是最常用的。DML触发器是由数据库的INSERT、UPDATE、DELETE操作触发,该类触发器可以在上述语句之前或之后执行,也可以每个受影响的行执行一次。

条件谓词:当在触发器中包含多个触发事件(INSERT、UPDATE、DELETE)的组合时,为了分别针对不同的事件进行不同的处理,需要使用ORACLE提供的条件谓词:

  1. INSERTING:当触发事件是INSERT时,取值为TRUE,否则为FALSE。
  2. UPDATING [(column_1,column_2,…,column_x)]:当触发事件是UPDATE时,如果修改了column_x列,则取值为TRUE,否则为FALSE。
  3. DELETING:当触发事件是DELETE时,则取值为TRUE,否则为FALSE。

示例:

  1. <span style="color: #008080;"> 1</span> <span style="color: #0000ff;">CREATE</span> <span style="color: #808080;">OR</span> <span style="color: #ff00ff;">REPLACE</span> <span style="color: #0000ff;">TRIGGER</span><span style="color: #000000;"> emp_sal_trigger
  2. </span><span style="color: #008080;"> 2</span> BEFORE <span style="color: #0000ff;">UPDATE</span> <span style="color: #0000ff;">OF</span> salary <span style="color: #808080;">OR</span> <span style="color: #0000ff;">DELETE</span>
  3. <span style="color: #008080;"> 3</span> <span style="color: #0000ff;">ON</span> employee <span style="color: #0000ff;">FOR</span><span style="color: #000000;"> EACH ROW
  4. </span><span style="color: #008080;"> 4</span> <span style="color: #0000ff;">WHEN</span> (old.did <span style="color: #808080;">=</span> <span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">)
  5. </span><span style="color: #008080;"> 5</span> <span style="color: #0000ff;">BEGIN</span>
  6. <span style="color: #008080;"> 6</span> <span style="color: #ff00ff;">CASE</span>
  7. <span style="color: #008080;"> 7</span> <span style="color: #0000ff;">WHEN</span> UPDATING (<span style="color: #ff0000;">‘</span><span style="color: #ff0000;">salary</span><span style="color: #ff0000;">‘</span>) <span style="color: #0000ff;">THEN</span>
  8. <span style="color: #008080;"> 8</span> <span style="color: #0000ff;">IF</span> :NEW.salary <span style="color: #808080;"><</span> :old.salary <span style="color: #0000ff;">THEN</span>
  9. <span style="color: #008080;"> 9</span> RAISE_APPLICATION_ERROR(<span style="color: #808080;">-</span><span style="color: #800000; font-weight: bold;">20001</span>, <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">部门1的员工工资不能降</span><span style="color: #ff0000;">‘</span><span style="color: #000000;">);
  10. </span><span style="color: #008080;">10</span> <span style="color: #0000ff;">END</span> <span style="color: #0000ff;">IF</span><span style="color: #000000;">;
  11. </span><span style="color: #008080;">11</span> <span style="color: #0000ff;">WHEN</span> DELETING <span style="color: #0000ff;">THEN</span>
  12. <span style="color: #008080;">12</span> RAISE_APPLICATION_ERROR(<span style="color: #808080;">-</span><span style="color: #800000; font-weight: bold;">20002</span>, <span style="color: #ff0000;">‘</span><span style="color: #ff0000;">不能删除部门1的员工记录</span><span style="color: #ff0000;">‘</span><span style="color: #000000;">);
  13. </span><span style="color: #008080;">13</span> <span style="color: #0000ff;">END</span> <span style="color: #ff00ff;">CASE</span><span style="color: #000000;">;
  14. </span><span style="color: #008080;">14</span> <span style="color: #0000ff;">END</span> emp_sal_trigger;

 

5. 替代触发器

INSTEAD OF用于对视图的DML触发,由于视图有可能是由多个表联结(JOIN)而成,因而并非所有的视图都是可更新的,但可以按照所需的方式执行更新。

创建INSTEAD OF触发器需要注意以下几点:

  1. 只能被创建在视图上,并且该视图没有指定WITH CHECK OPTION选项。
  2. 不能指定BEFORE或AFTER选项。
  3. FOR EACH ROW子句是可选的。
  4. 没有必要在针对一个表的视图上创建INSTEAD OF触发器,只要创建DML触发器就可以了。

示例:

  1. <span style="color: #008080;">1</span> <span style="color: #0000ff;">CREATE</span> <span style="color: #808080;">OR</span> <span style="color: #ff00ff;">REPLACE</span> <span style="color: #0000ff;">TRIGGER</span><span style="color: #000000;"> emp_delete_trigger
  2. </span><span style="color: #008080;">2</span> INSTEAD <span style="color: #0000ff;">OF</span> <span style="color: #0000ff;">DELETE</span> <span style="color: #0000ff;">ON</span> vw_emp <span style="color: #0000ff;">FOR</span><span style="color: #000000;"> EACH ROW
  3. </span><span style="color: #008080;">3</span> <span style="color: #0000ff;">DECLARE</span>
  4. <span style="color: #008080;">4</span> v_did dept.id<span style="color: #808080;">%</span><span style="color: #000000;">TYPE;
  5. </span><span style="color: #008080;">5</span> <span style="color: #0000ff;">BEGIN</span>
  6. <span style="color: #008080;">6</span> SELEC id <span style="color: #0000ff;">INTO</span> v_did <span style="color: #0000ff;">FROM</span> dept <span style="color: #0000ff;">WHERE</span> name<span style="color: #808080;">=</span><span style="color: #000000;">:OLD.dname;
  7. </span><span style="color: #008080;">7</span> <span style="color: #0000ff;">DELETE</span> <span style="color: #0000ff;">FROM</span> employee <span style="color: #0000ff;">WHERE</span> did<span style="color: #808080;">=</span><span style="color: #000000;"> v_did;
  8. </span><span style="color: #008080;">8</span> <span style="color: #0000ff;">END</span> emp_delete_trigger;

 

 

6. 系统触发器

系统触发器可以在DDL或数据库系统上被触发,数据库系统事件包括数据库服务器的启动或关闭,用户的登录与退出、数据库服务错误等。

系统事件触发器既可以建立在一个模式上,又可以建立在整个数据库上。当建立在模式(SCHEMA)之上时,只有模式所指定用户的DDL操作和它们所导致的错误才激活触发器,默认时为当前用户模式。当建立在数据库(DATABASE)之上时,该数据库所有用户的DDL操作和他们所导致的错误,以及数据库的启动和关闭均可激活触发器。

系统触发器的种类和事件出现的时机:

 

  1. <span style="color: #008080;"> 1</span> <span style="color: #008080;">--</span><span style="color: #008080;"> 创建记录用户登录注销日志的表</span>
  2. <span style="color: #008080;"> 2</span> <span style="color: #0000ff;">CREATE</span> <span style="color: #0000ff;">TABLE</span><span style="color: #000000;"> log_on_off_log
  3. </span><span style="color: #008080;"> 3</span> (<span style="color: #ff00ff;">user_name</span> <span style="color: #0000ff;">VARCHAR2</span>(<span style="color: #800000; font-weight: bold;">20</span><span style="color: #000000;">),
  4. </span><span style="color: #008080;"> 4</span> logon_date <span style="color: #0000ff;">timestamp</span><span style="color: #000000;">,
  5. </span><span style="color: #008080;"> 5</span> logoff_date <span style="color: #0000ff;">timestamp</span><span style="color: #000000;">);
  6. </span><span style="color: #008080;"> 6</span>
  7. <span style="color: #008080;"> 7</span> <span style="color: #008080;">--</span><span style="color: #008080;"> 创建登录触发器</span>
  8. <span style="color: #008080;"> 8</span> <span style="color: #0000ff;">CREATE</span> <span style="color: #808080;">OR</span> <span style="color: #ff00ff;">REPLACE</span> <span style="color: #0000ff;">TRIGGER</span><span style="color: #000000;"> logon_trigger
  9. </span><span style="color: #008080;"> 9</span> AFTER LOGON <span style="color: #0000ff;">ON</span> <span style="color: #0000ff;">DATABASE</span>
  10. <span style="color: #008080;">10</span> <span style="color: #0000ff;">BEGIN</span>
  11. <span style="color: #008080;">11</span> <span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> log_on_off_log (<span style="color: #ff00ff;">user_name</span>, logon_date) <span style="color: #0000ff;">VALUES</span><span style="color: #000000;"> (ora_login_user, systimestamp);
  12. </span><span style="color: #008080;">12</span> <span style="color: #0000ff;">END</span><span style="color: #000000;"> logon_trigger;
  13. </span><span style="color: #008080;">13</span>
  14. <span style="color: #008080;">14</span> <span style="color: #008080;">--</span><span style="color: #008080;"> 创建退出触发器</span>
  15. <span style="color: #008080;">15</span> <span style="color: #0000ff;">CREATE</span> <span style="color: #808080;">OR</span> <span style="color: #ff00ff;">REPLACE</span> <span style="color: #0000ff;">TRIGGER</span><span style="color: #000000;"> logoff_trigger
  16. </span><span style="color: #008080;">16</span> BEFORE LOGOFF <span style="color: #0000ff;">ON</span> <span style="color: #0000ff;">DATABASE</span>
  17. <span style="color: #008080;">17</span> <span style="color: #0000ff;">BEGIN</span>
  18. <span style="color: #008080;">18</span> <span style="color: #0000ff;">INSERT</span> <span style="color: #0000ff;">INTO</span> log_on_off_log (<span style="color: #ff00ff;">user_name</span>, logoff_date) <span style="color: #0000ff;">VALUES</span><span style="color: #000000;"> (ora_login_user, systimestamp);
  19. </span><span style="color: #008080;">19</span> <span style="color: #0000ff;">END</span> logoff_trigger;

 

 

事件触发时机说明
STARTUP AFTER 启动数据库实例之后触发
SHUTDOWN BEFORE 关闭数据库实例之前触发
SERVERERROR AFTER 数据库服务器发生错误之后触发
LOGON AFTER 成功登录到数据库后触发
LOGOFF BEFORE 断开数据库连接之前触发
DDL BEFORE,AFTER 在执行大多数DDL语句之前、之后触发
CREATE / ALTER / DROP BEFORE,AFTER 在执行CREATE或ALTER或DROP语句创建数据库对象之前、之后触发
RENAME BEFORE,AFTER 执行RENAME语句更改数据库对象名称之前、之后触发
GRANT / REVOKE BEFORE,AFTER 执行GRANT语句授予权限或REVOKE撤销权限之前、之后触发
AUDIT / NOAUDIT BEFORE,AFTER 执行AUDIT或NOAUDIT进行审计或停止审计之前、之后触发

 

Oracle数据库之PL/SQL触发器

标签:

人气教程排行