DML触发器是建立在基本表上的触发器,由DML语句触发,根据触发时序可分为BEFORE触发器与AFTER触发器。依据触发方式不同,又可分为语句级触发器和行级触发器。
创建DML触发器的语法如下:
其中:
①Tigger_name:创建的触发器名称。
②BEFORE、AFTER:指定触发器的触发时序,前者为前触发,即在执行触发操作之前执行;后者为后触发,即在执行触发操作之后执行触发器操作。
③dml_event:指出触发事件,触发事件可为INSERT、UPDATE和成DELETE操作;触发事件设置为UPDATE时,还可以用OF column_name子句进一步限制在更新哪些列时才激活触发;对于定义了多个触发事件的触发器而言,如果要确定当前究竟是激活哪种操作激活的触发器,则可以使用条件谓词INSERTING、UPDATING和DELETING进行判断。
④table name:指出触发事件所操作的表名。
⑤FOR EACH ROW:指定触发器是行级触发器,省略该选项所创建的则是语句触发器。
⑥WHEN trigger_condition:进一步限制激活触发器的条件,trigger_condition是一个Boolean类型的表达式,当其值为TRUE时触发事件才能激活触发器。
CREATE TRIGGER语句其余部分代码就是个PL/SQL块结构,这里不再重复介绍。
在行级触发器中,由于每操作1行数据触发器就激活1次,因此,为了使行级触发器内代码能够获取DML操作前后的行数据,Oracle引入了两个伪记录——:OLD和:NEW。行级触发器激活时,PL/SOL运行时系统自动创建并填充这两个伪记录。这两个伪记录中的字段名称和数据类型与触发事件所操作数据行中的列名和列数据相同。针对不同的触发事件,:OLD和:NEW中填充的内容见表12.4。
表12.4 :OLD和:NEW的含义(www.daowen.com)
行级触发器中要引用这两个伪记录时,可以像引用普通记录那样采用“记录名.字段名”形式。语句级触发器中,触发事件发生后,触发器只针对该DML语句执行1次,因此不能使用:OLW和:NEW标识符获取某列的新旧数据。
下面通过一个应用实例来演示这两种DML触发器的效果。实例要求先新建一张表,用于存储所有用户针对employees表执行的插入、修改、删除操作的日志记录,该表取名为employees_log,然后在employees表上创建语句触发器,实现这个日志记录功能。
在触发器创建后,只要有用户对employees表进行了插入、更新与删除数据操作,都会被触发执行,并向employees_log表中插入日志信息,而不管对employees表的数据影响到0行还是多行,都只插入一条日志信息。这时可以自行进行数据的增、删、改操作来进行验证。
再通过一个应用示例,来验证一下行级触发器的触发效果。在employees表上,再创建一个行级触发器,只要对employees表进行了插入、更新与删除数据操作,都会被触发执行,触发时除了向employees_log插入用户名、日志时间和操作类别之外,还把被所影响的数据行的员工ID、修改之前与之后的工资记录到日志表中,这就需要先为employees_log增加employee_id、old_salary、new_salary字段。
触发器创建后,在进行数据的增、删、改操作时,触发器触发执行,不但要像前一个示例一样向employees_log表中插入比较粗略的日志信息(不管对employees表的数据影响到0行还是多行,都只插入一条日志信息);还会插入比较细致的日志信息,比前一个触发器插入的记录多包含了employee_id、old_salary和new_salary信息(只有有数据被影响到才会插入,并且每影响1行,都会插入一条新的这样的日志记录)。读者可以自行用示例来进行验证。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。