第24章 数据库触发器.ppt
文本预览下载声明
Oracle SQLPL/SQL第24章 数据库触发器 本章要点 触发器的类型 触发器主要有三种类型: DML INSTEAD-OF触发器 系统触发器。 主要用于: 维护那些通过创建表时的声明约束无法实现的复杂的完整性约束。 通过记录已进行的改变以及是谁进行了该项改变来检查一个表中的信息。 当一个表发生改变时,自动向其他程序发送需要采取行动的信号。 在一个发布-预订环境中发布有关各种事件的信息。 DML触发器 DML触发器可以由DML语句激发 由DML语句的类型决定DML触发器的类型。 DML触发器可以在DML语句操作之前或之后激发。 DML触发器也可以在行或语句操作上激发 。 INSTEAD-OF触发器 INSTEAD-OF 触发器是行级别的,执行时,激发它的DML语句不执行。 只能定义在视图上(可以是关系型或是对象)。 Oracle8及更高版本才提供。 系统触发器 系统触发器在发生诸如数据库启动或关闭等系统事件时激发,而不是在执行DML语句时激发。 系统触发器也可以在DDL操作时,如表的创建时被激发。 创建触发器 创建DML触发器 DML触发器激发顺序 如果存在语句之前的触发器,先执行该触发器。 对于受语句影响每一行: 如果存在行之前的触发器,执行该触发器。 执行该语句本身。 如果存在行之后的触发器,执行该触发器。 如果存在语句之后的触发器,运行该触发器。 行级别触发器的相关标识符 触发语句处理每一行时,行级别触发器都激发一次。 在触发器内部,可以通过相关标识符:old和:new访问正在处理中的行的数据。 标识符:old和:new也被称为伪记录。 : old和:new相关标识符 WHEN子句 WHEN子句只适用于行级别触发器。 如果使用该子句,触发器体将只对满足由WHEN子句指定条件的行而执行。 触发器谓词 创建instead-of触发器 instead-of触发器用于以下两种情况: 允许修改一个本来无法修改的视图。 修改视图中嵌套表列的列。 可更改的与不可更改的视图 可更改视图:可以发出DML命令的视图。一般来说,视图如果不包括下列命令中的任何一项,它就是一个可更改视图 。 1、集合操作符(UNION、UNION ALL、MINUS) 2、聚集函数(SUM、AVG等) 3、GROUP BY、CONNECT BY或START WITH子句 4、DISTINCT操作符 5、连接 可更改连接视图的条件 如果一个视图是不可更改的,则可以在其上编写一个instead-of触发器来执行正确的操作,从而使该视图可更改。 如果需要进行其他处理的话,也可以在可更改视图上编写instead-of触发器。 创建系统触发器 系统触发器可以在两种不同种类的事件(即DDL或数据库)上激发。 DDL事件包括CREATE、ALTER或DROP语句。 而数据库事件包括服务器的启动或关闭,用户的登录或退出,以及服务器错误。 系统DLL和数据库事件 数据库与模式触发器 系统触发器可以在数据库级别或模式级别定义。 数据库级别的触发器不管触发事件何时发生都将激发,而模式级别触发器只有在指定的模式的触发事件发生时才会激发。 DATABASE和SCHEMA关键字决定了给定系统触发器的级别。如果没有用关键字SCHEMA来说明模式,则它就是拥有该触发器的默认模式。 事件属性函数 事件属性函数属系统触发器内部使用。 在程序中使用事件属性函数必须在它们的前面加上前缀SYS。 事件属性函数列表说明 使用SERVERERROR事件 SERVERERROR事件可以用于跟踪数据库中发生的错误。 错误代码可以使用触发器内部的SERVER_ERROR属性函数取出。 该函数只能确定堆栈中的错误码。但不能返回与该错误码相关的错误信息。 系统触发器和事务 系统触发器的事务行为与触发事件有关。系统触发器可以作为基于触发器正常结束时提交的独立事务激发,也可以作为当前用户事务的一部分激发。 STARTUP,SHUTDOWN,SEVERERROR和LOGON触发器都是由独立事务激发的,而LOGOFF和DDL触发器则作为当前事务的一部分被激发。 触发器实现的任务将被提交处理。在使用DDL触发器的情况下,当前事务(也就是CREATE、ALTER或DROP语句)将自动提交。LOGOFF触发器的操作也将作为会话中最后事务的一部分提交。 系统触发器和WHEN子句 系统触发器可以使用WHEN子句来指定触发器激发条件。然而,对每一种系统触发器所指定的条件类型有如下限制: STARTUP和SHUTDOWN触发器不能带有任何条件。 SERVERERROR触发器只可以使用ERRNO测试来检查具体错误。 LOGON和LOGOFF触发器可
显示全部