读书人

oracle 触发器的种类和触发事件,DML触

发布时间: 2013-10-21 17:02:52 作者: rapoo

oracle 触发器的种类和触发事件,DML触发器,DDL事件触发器,替代触发器,查看触发器,

转载:http://heisetoufa.iteye.com/blog/367314

触发器的种类和触发事件
触发器必须由事件才能触发。触发器的触发事件分可为3类,分别是DML事件、DDL事件和数据库事件。
每类事件包含若干个事件,如下所示。数据库的事件是具体的,在创建触发器时要指明触发的事件。
种? 类 关 键 字 含??? 义

      ld.字段名或:new.字段名
      * 触发器体内禁止使用COMMIT、ROLLBACK、SAVEPOINT语句,也禁止直接或间接地调用含有上述语句的存储过程。
      定义一个触发器时要考虑上述多种情况,并根据具体的需要来决定触发器的种类。
      DML触发器的创建
      创—ML触发器需要CREATE TRIGGER系统权限。创—ML触发器的语法如下:
      CREATE [OR REPLACE] TRIGGER 触发器名
      {BEFORE|AFTER|INSTEAD OF} 触发事件1 [OR 触发事件2...]
      ON 表名
      WHEN 触发条件
      [FOR EACH ROW]
      DECLARE
      声明部分
      BEGIN
      主体部分
      END;
      其中:
      OR REPLACE:表示如果存在同名触发器,则覆盖原有同名触发器。
      BEFORE、AFTER和INSTEAD OF:说明触发器的类型。
      WHEN 触发条件:表示当该条件满足时,触发器才能执行。
      触发事件:指INSERT、DELETE或UPDATE事件,事件可以并行出现,中间用OR连接。
      对于UPDATE事件,还可以用以下形式表示对某些列的修改会引起触发器的动作:
      UPDATE OF 列名1,列名2...
      ON 表名:表示为哪一个表创建触发器。
      FOR EACH ROW:表示触发器为行级触发器,省略则为语句级触发器。
      触发器的创建者或具有DROP ANY TIRGGER系统权限的人才能删除触发器。删除触发器的语法如下:
      DROP TIRGGER 触发器名
      可以通过命令设置触发器的可用状态,使其暂时关闭或重新打开,即当触发器暂时不用时,可以将其置成无效状态,在使用时重新打开。该命令语法如下:
      ALTER TRIGGER 触发器名 {DISABLE|ENABLE}
      其中,DISABLE表示使触发器失效,ENABLE表示使触发器生效。
      同存储过程类似,触发器可以用SHOW ERRORS 检查编译错误。
      行级触发器的应用
      在行级触发器中,SQL语句影响的每一行都会触发一次触发器,所以行级触发器往往用在对表的每一行的操作进行控制的场合。若在触发器定义中出现FOR EACH ROW子句,则为语句级触发器。
      【训练1】? 创建包含插入、删除、修改多种触发事件的触发器DML_LOG,对EMP表的操作进行记录。用INSERTING、DELETING、UPDATING谓词来区别不同的DML操作。
      在创建触发器之前,需要先创建事件记录表LOGS,该表用来对操作进行记录。该表的字段含义解释如下:
      LOG_ID:操作记录的编号,数值型,它是该表的主键,由序列自动生成。
      LOG_TABLE:进行操作的表名,字符型,非空,该表设计成可以由多个触发器共享使用。比如我们可以为dept表创建类似的触发器,同样将操作记录到该表。
      LOG_DML:操作的动作,即INSERT、DELETE或UPDATE三种之一。
      LOG_KEY_ID:操作时表的主键值,数值型。之所以记录表的主键,是因为主键是表的记录的惟一标识,可以识别是对哪一条记录进行了操作。对于emp表,主键是empno。
      LOG_DATE:操作的日期,日期型,取当前的系统时间。
      LOG_USER:操作者,字符型,取当时的操作者账户名。比如登录SCOTT账户进行操作,在该字段中,记录账户名为SCOTT。
      步骤1:在SQL*Plus中登录STUDENT账户,创建如下的记录表LOGS:

                                                                                                                                                                已删除?1?行。??已创建?1?行。??已更新?1?行。??提交完成。???


                                                                                                                                                              步骤4:检查emp表和employee表中被插入、删除和更新的雇员。
                                                                                                                                                              运行结果略,请自行验证。
                                                                                                                                                              ? 说明:在触发器中判断触发事件,根据不同的事件对employee表进行不同的操作。
                                                                                                                                                              【练习1】创建一个emp表的触发器EMP_TOTAL,每当向雇员表插入、删除或更新雇员信息时,将新的统计信息存入统计表EMPTOTAL,使统计表总能够反映最新的统计信息。
                                                                                                                                                              统计表是记录各部门雇员总人数、总工资的统计表,结构如下:
                                                                                                                                                              部门编号 number(2)
                                                                                                                                                              总人数 number(5)
                                                                                                                                                              总工资 number(10,2)
                                                                                                                                                              练习
                                                                                                                                                              1. 下列有关触发器和存储过程的描述,正确的是:
                                                                                                                                                              A. 两者都可以传递参数
                                                                                                                                                              B. 两者都可以被其他程序调用
                                                                                                                                                              C. 两种模块中都可以包含数据库事务语句
                                                                                                                                                              D. 两者创建的系统权限不同
                                                                                                                                                              2. 下列事件,属于DDL事件的是:
                                                                                                                                                              ??? A.? INSERT B.? LOGON
                                                                                                                                                              ??? C.? DROP D.? SERVERERROR
                                                                                                                                                              3. 假定在一个表上同时定义了行级和语句级触发器,在一次触发当中,下列说法正确的是:
                                                                                                                                                              ??? A. 语句级触发器只执行一次
                                                                                                                                                              ??? B. 语句级触发器先于行级触发器执行
                                                                                                                                                              ?????????? C. 行级触发器先于语句级触发器执行
                                                                                                                                                              ??????????????? D. 行级触发器对表的每一行都会执行一次
                                                                                                                                                              4. 有关行级触发器的伪记录,下列说法正确的是:
                                                                                                                                                              ?? A.? INSERT事件触发器中,可以使用:old伪记录。
                                                                                                                                                              ?? B.? DELETE事件触发器中,可以使用:new伪记录。
                                                                                                                                                              ?? C.? UPDATA事件触发器中,只能使用:new伪记录。
                                                                                                                                                              ??????????????? D.? UPDATA事件触发器中,可以使用:old伪记录。
                                                                                                                                                              5. 下列有关替代触发器的描述,正确的是:
                                                                                                                                                              ??? A. 替代触发器创建在表上
                                                                                                                                                              ??????????????? B. 替代触发器创建在数据库上
                                                                                                                                                              ??????????????? C. 通过替代触发器可以向基表插入数据
                                                                                                                                                              ??????????????? D. 通过替代触发器可以向视图插入数据

读书人网 >编程

热点推荐