250 likes | 425 Views
山东理工大学计算机学院. 数据库系统概论 An Introduction to Database System 第三章 关系数据库标准语言 SQL. 3.8 触发器概述. 触发器采用事件驱动机制 , 当某个触发事件发生时,触发器触发一系列操作。关系数据库中表示复杂约束的方法主要使用触发器。 触发器是一种特殊类型的 存储过程 ,当一个触发器建立后,它作为一个数据库对象被存储。当事件出现时,触发器被触发,定义在触发器中的功能将被 DBMS 执行。
E N D
山东理工大学计算机学院 数据库系统概论 An Introduction to Database System 第三章 关系数据库标准语言SQL An Introduction To Database System
3.8 触发器概述 • 触发器采用事件驱动机制,当某个触发事件发生时,触发器触发一系列操作。关系数据库中表示复杂约束的方法主要使用触发器。 • 触发器是一种特殊类型的存储过程,当一个触发器建立后,它作为一个数据库对象被存储。当事件出现时,触发器被触发,定义在触发器中的功能将被DBMS执行。 • 触发器建立在表一级,它与指定的数据修改操作相对应。SQL Server中的触发器可分为INSERT触发器、UPDATE触发器和DELETE触发器三种 An Introduction To Database System
触发器 • 触发器的主要优点 • 触发器支持的功能 • 建立触发器的语句格式 • INSERT 触发器 • UPDATE触发器 • DELETE触发器 • 删除和修改触发器 • 触发器中可使用的特殊表 • 使用触发器的考虑 An Introduction To Database System
3.8.1触发器的优点 • 触发器能够实施比外键约束、检查约束和规则对象等更为复杂的数据完整性检查 • 和约束相比,触发器提供了更多的灵活性。约束将系统错误信息返回给用户,但这些错误并不是总能有帮助,而触发器则可以打印错误信息,调用其他存储过程,或根据需要纠正错误 • 无论对表中的数据进行何种修改,录入或更新,触发器都能被激活,对数据实施完整性检查 • 触发器能够级联修改数据库中的表内容 An Introduction To Database System
3.8.2触发器支持的功能 • 触发器可以在事件之前、之后执行,还可以替代事件本身。例如可以定义触发器在对某关系执行insert、 update和delete操作之前(或之后)触发 • 触发器代码可以引用事件中对于元组修改前后的值(OLD值和NEW值),对于update语句,OLD值和NEW值意义很明确 • 对于update事件可以定义对哪个关系、或关系中的哪一列修改时,触发器触发 • 可以用WHEN子句来指定执行条件,当触发器被触发后,触发器功能代码只有在条件成立时才执行 An Introduction To Database System
3.8.2触发器支持的功能(续) (5)触发器有语句级触发器和行级触发器之分。所谓语句级触发器是指当update语句执行完触发一次,而行触发器是指当update语句每修改完一个元组就触发一次 (6)触发器可以完成一些复杂的数据检查,可以实现某些操作的前后处理等 (7)触发器定义的约束可以在任何颗粒级别上实现、表示动态的或静态的约束、延迟或不延迟进行触发检查、可以用SQL语句定义约束触发器的功能。 An Introduction To Database System
3.8.3建立触发器的语句格式 • CREATE TRIGGER 触发器名ON [表名、视图名] [WITH ENCRYPTION]FOR {INSERT,UPDATA,DELETE }AS SQL操作语句参数说明:表名,视图名:为触发该触发器的表名或视图名。SQL Server中,只有表的所有者才有权建立触发器。INSERT,UPDATA,DELETE :说明触发触发器的事件。一个定义语句允许定义多个触发事件,用逗号分开,第2个只能是插入和更新语句。WITH ENCRYPTION:该选项对触发器的定义文本加密。SQL操作语句:指定触发器动作。该语句中可以指定多个触发器操作,这时要用BEGIN…END将它们组成语句块。 An Introduction To Database System
3.8.4Insert触发器 An Introduction To Database System
3.8.5 Update触发器 An Introduction To Database System
3.8.6 Delete触发器 An Introduction To Database System
3.8.7 删除和修改触发器 • 删除触发表时,触发器被随之删除。可以用DROP语句删除已定义的触发器。也可以使用ALTER TRIGGER语句修改触发器定义。删除已定义触发器的语句格式:DROP TRIGGER [OWNER.] 触发器名 [,[OWNER.] 触发器名] An Introduction To Database System
3.8.8 触发器中可使用的特殊表 • 使用触发器时,SQL Server提供了两张特殊的临时表: inserted表和deleted表。这两张表存在于高速缓存中,它们与创建触发器的表有相同的结构。1、用户可以使用该表检查某些修改操作的效果。2、但用户不能直接修改该表中的数据。3、用户可以使用该表的内容作为查询操作的判断条件,但要在FROM中写出使用的表名(inserted 或deleted An Introduction To Database System
特殊表(续) (1) inserted表:存放被INSERTE和UPDATE的新数据。当向表中插入数据时,INSERT触发器被触发。新的记录增加到触发器表中和inserted表中。inserted表是一个逻辑表,保存了所插入记录的拷贝,触发器可以检查inserted表,来确定该触发器的操作是否应该执行和如何执行。(2)deleted表:存放被DELETE和UPDATE的旧数据。当触发一个DELETE触发器时,被删除的记录放在一个特殊的deleted表中。deleted表是一个逻辑表,用来保存已经从表中删除的记录。DELETE触发器可以参考deleted表中的数据 An Introduction To Database System
特殊表(续) (3)UPDATE触发器可使用deleted表和inserted表修改一条记录等于删除一条旧记录和插入一条新记录。UPDATE可以看成是由DELETE语句和 INSERT 语句组成。当在一个有UPDATE触发器的表上修改一条记录时,表中原来的记录移动到deleted表中,修改过的记录插入到inserted表中。UPDATE触发器可以参考deleted表和inserted表,以便确定如何执行触发器的操作 An Introduction To Database System
3.8.9 使用触发器的考虑 1、对于每个数据操作语句,无论它影响一行还是多行,对同一个触发器都只能激活一次。2、触发器最大的用途是维护数据完整性,而不是返回结果。3、只是在必要的时候使用触发器。如果使用约束,规则,默认就可以实现预定的数据完整性时,应优先考虑使用这3种措施。4、使触发器的定义语句尽可能清晰简单。5、触发器在操作发生之后执行,约束在操作发生之前起作用。如果在触发器表上有约束,那么这些约束在触发器执行之前进行检查。如果操作与约束有冲突,那么触发器不执行。6、触发器不能在临时表或视图上创建,但可以参照这些对象。7、 触发器和激活它的语句作为单个事务处理,如果检查到严重错误,整个事务自动撤销 An Introduction To Database System
3.9 存储过程 1 存储过程的概念2 存储过程的创建3 执行存储过程的语句格式4 更改和删除存储过程5 SQL Server提供的存储过程6 存储过程说明和限制 An Introduction To Database System
3.9 存储过程的概念 • 存储过程是存放在服务器上的预先定义与编译好的SQL语句的命名集合,是一个独立的数据库对象。 • 存储过程在第一次执行时进行语法检查和编译。编译好的版本存储在过程高速缓存中用于后续调用,执行速度快。 • 存储过程由应用程序激活,而不是由系统自动执行 • 存储过程可以由应用程序多次激活,提高重复任务的执行性能 • 存储过程可以接受输入参数和返回值 An Introduction To Database System
存储过程创建和处理过程图 An Introduction To Database System
分析 • 创建后先进行语法分析,语法正确的存储过程存入到系统表sysobjects和syscomments中。第一次执行时先进行优化和编译,编译后的执行计划放在过程高速缓存中,以备后续过程调用。所以,存储过程在第一次执行以后,通常不再需要进行语法分析、优化和编译,以后的过程调用只须把查询计划从高速缓存中调出执行即可 An Introduction To Database System
综合存储过程特点 • 存储过程作为一个程序逻辑处理单元,使多个应用程序可以共享应用程序的处理逻辑单元,所有的客户机程序可以使用同一个存储过程进行各种操作,从而确保数据访问和操作的一致性,也提高了应用程序的可维护性 • 由于存储过程在第一次执行之后,就驻存在高速缓存存储器中,因此可以提高系统的执行效率 • 存储过程提供一种安全机制。如果用户被授予执行存储过程的权限,那么既使该用户没有执行访问在该存储过程中所参考的表或者视图的权限,该用户也可以完全执行该存储过程 An Introduction To Database System
综合存储过程特点(续) • 减少了网络的流量负载。由于存储过程是存放在服务器端的,因此客户端要执行存储过程时,只需要传送一条命令即可,如果不使用存储过程,则需要传送许多条SQL语句 • 因为存储过程提供该前端应用程序共享的处理逻辑,若要改变业务规则或策略,只需改变存储过程和参数,不用修改应用程序。 An Introduction To Database System
3.9 存储过程 1 存储过程的概念2 存储过程的创建3 执行存储过程的语句格式4 更改和删除存储过程5 SQL Server提供的存储过程6 存储过程说明和限制 An Introduction To Database System
2 存储过程的创建 • CREATE PROCEDURE〈过程名〉(参数表)AS SQL语句SQL Server创建存储过程的语句格式:CREATE PRO[CEDURE] [owner.]procedure_name[;number] [(parameter1),…, [parameter255 ] ] ] [{FOR REPLICATION} | {WITH RECOMPILE} [{[WITH] | [,] } ENCRYPTION ] ]AS [FOR REPLICATION]sql_statements An Introduction To Database System
参数说明 • oprocedure_name:新建存储过程名;onumber:区分同名的存储过程,如proc;1,proc;2。 • 参数格式:@参数名 数据类型[=缺省值] [output]。 • output:该参数为返回参数。oFOR REPLICATION :说明所建立的存储过程用于SQL Server的数据复制。 • WITH RECOMPILE:说明所建立的存储过程不在高速缓存中保存,每次执行重新编译。 • ENCRYPTION:对存储在syscomments系统表中的存储过程定义文本进行加密,避免他人查看或修改 • sql_statements:定义存储过程的具体作用的SQL语句,可以包含任意多的SQL语句。sql语句中不能使用CREATE(VIEW、TRIGER、DEFAULT、RULE、PROCEDURE等)语句,同时要慎重使用其他的CREATE、DROP等语句。 An Introduction To Database System
3.9.6 存储过程说明和限制 • 存储过程说明和限制:其它为永久存储过程。永久存储过程建立在当前数据库中。 在存储过程定义语句中不能使用CREATE语句来创建以下数据库对象:视图,默认,规则,触发器,存储过程。在过程中如果创建了这些对象以外的其它数据对象,之后又删除它们,那么在该过程内不能再创建与该对象同名的新对象。 在存储过程嵌套调用时,被调用的存储过程可以访问调用者所建立的除临时表以外的其它所有数据库对象。 An Introduction To Database System