第 8 章 存储过程与触发器

46
8 8 第第第第第第第第 第第第第第第第第

description

第 8 章 存储过程与触发器. 本章学习目标 l 理解存储过程和触发器的作用 l 熟练创建和管理存储过程及触发器 l 灵活运用存储过程和触发器提高系统开发效率. - PowerPoint PPT Presentation

Transcript of 第 8 章 存储过程与触发器

Page 1: 第 8 章  存储过程与触发器

第第 88 章 存储过程与触发章 存储过程与触发器器

Page 2: 第 8 章  存储过程与触发器

本章学习目标

理解存储过程和触发器的作用 熟练创建和管理存储过程及触发器 灵活运用存储过程和触发器提高系统开发效率

Page 3: 第 8 章  存储过程与触发器

8.1 8.1 存储过程存储过程8.1.1 8.1.1 存储过程基础知识存储过程基础知识11 .存储过程简介.存储过程简介 存储过程是存储在服务器上的由存储过程是存储在服务器上的由 SQLSQL 语句和控制流语句组语句和控制流语句组成的一个预编译集合。存储过程划分为系统存储过程以及用成的一个预编译集合。存储过程划分为系统存储过程以及用户存储过程。一个存储过程可以作为一个独立的单元进行处户存储过程。一个存储过程可以作为一个独立的单元进行处理。在理。在 SQL ServerSQL Server 中可以通过存储过程来完成很多管理任务,中可以通过存储过程来完成很多管理任务,利用一些常用的系统存储过程可以很方便的查看、操作数据利用一些常用的系统存储过程可以很方便的查看、操作数据库对象。系统存储过程的命名通常以”库对象。系统存储过程的命名通常以” sp_”sp_” 作为前缀,并且作为前缀,并且存储于存储于 MasterMaster 数据库中,如果用户拥有足够的权限,就可以数据库中,如果用户拥有足够的权限,就可以在任何数据库中调用这些存储过程。在任何数据库中调用这些存储过程。存储过程提供了一种封装某一个需要重复执行任务的方法。存储过程提供了一种封装某一个需要重复执行任务的方法。一旦定义了一个存储过程之后,在应用程序中就可以对其进一旦定义了一个存储过程之后,在应用程序中就可以对其进行调用。在存储过程中,不仅可以包含程序流、逻辑以及对行调用。在存储过程中,不仅可以包含程序流、逻辑以及对数据库的查询,而且也可以接受参数、输出参数、返回单个数据库的查询,而且也可以接受参数、输出参数、返回单个或多个结果集。或多个结果集。

Page 4: 第 8 章  存储过程与触发器

所以通过设计自定义用户存储过程,用户可以使其实现强所以通过设计自定义用户存储过程,用户可以使其实现强大的编程功能。大的编程功能。 使用存储过程可以比单独的使用存储过程可以比单独的 SQLSQL 语句完成更为复杂的功语句完成更为复杂的功能,并且系统会对存储过程中的能,并且系统会对存储过程中的 SQLSQL 语句进行了预编译处理,语句进行了预编译处理,使得执行速度有了大幅度的提升。存储过程被第一次调用后,使得执行速度有了大幅度的提升。存储过程被第一次调用后,会保存在高速缓冲区中,这样再次执行同一个存储过程时,会保存在高速缓冲区中,这样再次执行同一个存储过程时,会提高了重复调用的效率。在实际应用中,可以将复杂的商会提高了重复调用的效率。在实际应用中,可以将复杂的商业规则封装在存储过程中,从而提高程序语句的利用率。业规则封装在存储过程中,从而提高程序语句的利用率。

2 .存储过程的优点•存储过程一旦执行一次后,其执行的计划就会驻留在计算机的高速缓冲存储器中。其后对同一个存储过程的调用就可以直接利用编译后在高速缓存中的二进制形式来完成操作。•可以在单个存储过程中执行一系列 SQL 语句,因而可以用于设计、封装企业的功能模块。应用程序使用相同的存储过程进行操作,确保了在数据访问、操纵的一致性。

Page 5: 第 8 章  存储过程与触发器

可以在当前的存储过程内部引用其它存储过程,这样可以将复杂语句进行简化。

提供了一种数据库访问的途径,只需要用户拥有执行存储过程的权限,那么通过使用存储过程就可以完成对数据库的各种操作,如添加数据、修改数据、删除数据等,而不需要考虑用户是否拥有存储过程所处理的数据对象的访问权限。

3 .使用存储过程的注意事项•在命名自定义存储过程时避免与系统存储过程名相同。•存储过程最多能够支持 32 层的嵌套。•命名存储过程中的标识符时,长度不能超过 128 个字符。•存储过程中参数的个数不能超过 2100 。

Page 6: 第 8 章  存储过程与触发器

8.1.2 8.1.2 创建和执行存储过程创建和执行存储过程在在 SQL ServerSQL Server 中,既可以通过企业管理器,也可以通过使用中,既可以通过企业管理器,也可以通过使用CREATE PROCEDRUECREATE PROCEDRUE 语句的方式来创建存储过程。语句的方式来创建存储过程。11 .使用企业管理器创建存储过程.使用企业管理器创建存储过程步骤:步骤:①在企业管理器中,展开服务器组、服务器节点、数据库节①在企业管理器中,展开服务器组、服务器节点、数据库节点。点。②选择某一个数据库并在该节点上点击鼠标右键,选择【新②选择某一个数据库并在该节点上点击鼠标右键,选择【新建】菜单下的【存储过程】级联菜单,将弹出如图建】菜单下的【存储过程】级联菜单,将弹出如图 8-18-1 所示所示的对话框。的对话框。

图 8-1  新建存储过程对话框

Page 7: 第 8 章  存储过程与触发器

③③在【存储过程属性】对话框中的【文本】编辑框中,对在【存储过程属性】对话框中的【文本】编辑框中,对[OWNER][OWNER] 以及以及 [PROCEDURE NAME][PROCEDURE NAME] 部分进行修改,分部分进行修改,分别修改为该存储过程的所有者和存储过程名称,并且输入该别修改为该存储过程的所有者和存储过程名称,并且输入该存储过程所包含的存储过程所包含的 SQLSQL 语句。如图语句。如图 8-28-2 所示为创建了一个所示为创建了一个用于查询学生信息的存储过程。用于查询学生信息的存储过程。

图 8-2  用于查询学生信息的存储过程

Page 8: 第 8 章  存储过程与触发器

④④如果需要验证存储过程中的如果需要验证存储过程中的 SQLSQL 语句的正确性,可以单语句的正确性,可以单击【检查语法】按钮,如果没有语法错误则会弹出如图击【检查语法】按钮,如果没有语法错误则会弹出如图 8-38-3所示的“语法检查成功”的对话框。所示的“语法检查成功”的对话框。

图 8-3 “语法检查成功”的提示对话框

⑤当存储过程中没有语法错误后,可以单击【确定】按钮来 保存自定义的存储过程。

Page 9: 第 8 章  存储过程与触发器

22 .使用.使用 CREATE PROCEDURECREATE PROCEDURE 语句来创建存储过程语句来创建存储过程该语句可以创建永久使用的存储过程,也可以创建局部临时该语句可以创建永久使用的存储过程,也可以创建局部临时过程、全局临时过程。过程、全局临时过程。语法格式为:语法格式为:CREATE PROCEDURE CREATE PROCEDURE 存储过程名称 存储过程名称 [;[; 数值数值 ]][{@[{@ 参数 数据类型参数 数据类型 }} [VARYING] [= [VARYING] [= 参数的默认值参数的默认值 ] [OUTPUT] [,…n]] [OUTPUT] [,…n][ WITH { RECOMPILE | ENCRYPTION | RECOMPILE [ WITH { RECOMPILE | ENCRYPTION | RECOMPILE ,, EN ENCRYPTION } ] CRYPTION } ] [ FOR REPLICATION ] [ FOR REPLICATION ] AS SQLAS SQL 语句 语句 [ ...[ ...n n ] ]] ]

其中:•存储过程名称 必须符合标识符命名规则,而且对于数据库以及所有者命名必须唯一。一个完整的命名不能超过 128个字符。

Page 10: 第 8 章  存储过程与触发器

数值选项 便于对存储过程进行分组,这样在删除存储过程时可以将同一个组中的所有过程同时删除。比如,一个组中有两个存储过程, orderproc;1 、 orderproc;2 ,那么可以使用 DROP PROCEDURE orderproc 删除整个组。

参数 在 CREATE PROCEDURE 语句中可以申明一个或者多个参数。在执行存储过程时必须提供每个参数的值。定义参数时将 @ 作为参数名称的第一个字符,而且必须符合标识符的命名规则。参数的作用范围仅限于过程内部。

数据类型 每一个参数都需要为其确定一个数据类型。除 cursor类型以外,所有的数据类型都适用于存储过程中的参数。参数的数据类型为 cursor 时,必须指定 VARYING以及 OUTPUT 选项。

SQL 语句 为在存储过程中需要执行的操作。

Page 11: 第 8 章  存储过程与触发器

【例【例 8-18-1 】使用】使用 CREATE PROCEDURECREATE PROCEDURE 语句创建一个名称语句创建一个名称为为 proc_bjrsproc_bjrs 的存储过程,用于检索现有班级及人数。的存储过程,用于检索现有班级及人数。CREATE PROCEDURE proc_bjrs ASCREATE PROCEDURE proc_bjrs AS SELECT DISTINCT( SELECT DISTINCT( 班级表班级表 .. 班级编号班级编号 ),), 班级表班级表 .. 班级名称班级名称 ,,人数人数 =COUNT(=COUNT( 学生基本信息表学生基本信息表 .. 学号学号 )) FROM FROM 学生基本信息表学生基本信息表 ,, 班级表班级表 WHERE WHERE 班级表班级表 .. 班级编号班级编号 ==学生基本信息表学生基本信息表 .. 班级编号班级编号 GROUP BY GROUP BY 班级表班级表 .. 班级编号班级编号 ,, 班级表班级表 .. 班级名称班级名称GOGO在查询分析器中执行以上命令后,然后执行该存储过程在查询分析器中执行以上命令后,然后执行该存储过程 EXEEXECUTE proc_bjrsCUTE proc_bjrs ,运行结果如图,运行结果如图 8-48-4 所示。所示。

Page 12: 第 8 章  存储过程与触发器

图 8-4 检索现有班级以及人数

Page 13: 第 8 章  存储过程与触发器

【【例例 8-28-2 】设计一个带有参数的存储过程,该参数用于传递】设计一个带有参数的存储过程,该参数用于传递班级编号,根据该参数在学生基本信息表中检索出某一个班班级编号,根据该参数在学生基本信息表中检索出某一个班级中所有学生的信息。级中所有学生的信息。CREATE PROCEDURE proc_bjcx @bjbh VARCHAR(8)CREATE PROCEDURE proc_bjcx @bjbh VARCHAR(8)ASAS SELECT * FROM SELECT * FROM 学生基本信息表 学生基本信息表 WHERE WHERE 班级编号班级编号 ==@bjbh@bjbhGOGO其中参数其中参数 @bjbh@bjbh 用于接收班级编号,在实际调用中根据该参用于接收班级编号,在实际调用中根据该参数将会返回一个结果集。例如,数将会返回一个结果集。例如, EXECUTE proc_bjcx '2005EXECUTE proc_bjcx '20051003'1003' ,将会显示班级编号为,将会显示班级编号为 2005100320051003 的学生信息。运行结的学生信息。运行结

果如图果如图 8-58-5 所示所示

Page 14: 第 8 章  存储过程与触发器

图 8-5 用于传递班级编号的存储过程

Page 15: 第 8 章  存储过程与触发器

8.1.3 8.1.3 修改与删除存储过程修改与删除存储过程在在 SQL ServerSQL Server 中,可以通过企业管理器或中,可以通过企业管理器或 SQLSQL 语句两种方语句两种方式修改或删除存储过程。式修改或删除存储过程。11 .使用企业管理器修改存储过程.使用企业管理器修改存储过程①在企业管理器中,展开服务器组、服务器以及数据库节点。①在企业管理器中,展开服务器组、服务器以及数据库节点。

②选择某一个数据库,展开该数据库节点后点击【存储过②选择某一个数据库,展开该数据库节点后点击【存储过程】,在右侧的窗口中将会显示出存储过程的列表。右击需程】,在右侧的窗口中将会显示出存储过程的列表。右击需要修改的存储过程,在弹出菜单中选择【属性】,弹出存储要修改的存储过程,在弹出菜单中选择【属性】,弹出存储过程属性对话框,如图过程属性对话框,如图 8-68-6 所示。所示。

图 8-6 【存储过程属性】对话框

Page 16: 第 8 章  存储过程与触发器

③③在【存储过程属性】对话框的【文本】编辑框中修改包含在【存储过程属性】对话框的【文本】编辑框中修改包含的的 SQLSQL 语句。需要注意的是,存储过程的名称不能修改。语句。需要注意的是,存储过程的名称不能修改。④在检查了语法的正确性之后,可以单击【确定】按钮保存修④在检查了语法的正确性之后,可以单击【确定】按钮保存修改并关闭对话框。改并关闭对话框。22 .使用企业管理器重命名存储过程.使用企业管理器重命名存储过程①在企业管理器中,展开服务器组、服务器以及数据库节点。①在企业管理器中,展开服务器组、服务器以及数据库节点。②选择某一个数据库,展开该数据库节点后点击【存储过程】,②选择某一个数据库,展开该数据库节点后点击【存储过程】,在右侧的窗口中将会显示出存储过程的列表。右击需要重命名在右侧的窗口中将会显示出存储过程的列表。右击需要重命名的存储过程,并选择弹出菜单中的【重命名】命令,如图的存储过程,并选择弹出菜单中的【重命名】命令,如图 8-78-7所示。所示。

Page 17: 第 8 章  存储过程与触发器

图 8-7 弹出菜单中的【重命名】命令

③重新输入存储过程的名称后,按下回车键完成修改。

Page 18: 第 8 章  存储过程与触发器

33 .使用.使用 ALTER PROCEDUREALTER PROCEDURE 语句修改存储过程语句修改存储过程ALTER PROCEDUREALTER PROCEDURE 语句可以对数据库中已有的存储过程语句可以对数据库中已有的存储过程进行修该,但不会更改权限,也不影响相关的存储过程或触进行修该,但不会更改权限,也不影响相关的存储过程或触发器。该语句的语法格式为:发器。该语句的语法格式为:ALTER PROCEDURE ALTER PROCEDURE 存储过程名称 存储过程名称 [;[; 数值数值 ]][{@[{@ 参数 数据类型参数 数据类型 }} [VARYING] [= [VARYING] [= 参数的默认值参数的默认值 ] [OUTPUT] [,…n]] [OUTPUT] [,…n][ WITH { RECOMPILE | ENCRYPTION | RECOMPILE [ WITH { RECOMPILE | ENCRYPTION | RECOMPILE ,, EN ENCRYPTION } ] CRYPTION } ] [ FOR REPLICATION ] [ FOR REPLICATION ] AS SQLAS SQL 语句 语句 [ ...[ ...n n ] ]] ]其中,存储过程名称为数据库中已经存在的过程名,语法中其中,存储过程名称为数据库中已经存在的过程名,语法中的常用选项与的常用选项与 CREATE PROCEDURECREATE PROCEDURE 语句一致。语句一致。

Page 19: 第 8 章  存储过程与触发器

【【例例 8-38-3 】修改已经创建的存储过程】修改已经创建的存储过程 proc_bjcxproc_bjcx 及其功能,及其功能,将其修改为可以根据系部编号来查询某一个系部中所有学生将其修改为可以根据系部编号来查询某一个系部中所有学生的信息。修改后将存储过程名称重命名为的信息。修改后将存储过程名称重命名为 proc_xbcxproc_xbcx 。。在查询分析器中运行如下命令,即可完成重命名:在查询分析器中运行如下命令,即可完成重命名:ALTER PROCEDURE proc_bjcx @xbbh VARCHAR(2)ALTER PROCEDURE proc_bjcx @xbbh VARCHAR(2)ASAS SELECT * FROM SELECT * FROM 学生基本信息表学生基本信息表 WHERE WHERE 班级编号班级编号 IN (SELECT IN (SELECT 班级编号 班级编号 FROM FROM 班级表 班级表 WHERE WHERE 系部编系部编号号 =@xbbh) =@xbbh) GOGOSP_RENAME 'proc_bjcx' , 'proc_xbcx'SP_RENAME 'proc_bjcx' , 'proc_xbcx'GOGO

Page 20: 第 8 章  存储过程与触发器

使用使用 SP_RENAMESP_RENAME 可以重新命名一个现有的存储过程。可以重新命名一个现有的存储过程。 SPSP_RENAME_RENAME 的语法格式为:的语法格式为:SP_RENAME SP_RENAME 原名称 原名称 , , 新名称。新名称。完成修改后查询系部编号为’完成修改后查询系部编号为’ 01’01’ 的学生信息。的学生信息。EXEC proc_xbcx '01'EXEC proc_xbcx '01'44 .使用企业管理器删除存储过程.使用企业管理器删除存储过程①在企业管理器中,展开服务器组、服务器以及数据库节点。①在企业管理器中,展开服务器组、服务器以及数据库节点。

②选择某一个数据库,展开该数据库后点击【存储过程】,②选择某一个数据库,展开该数据库后点击【存储过程】,在右侧的窗口中显示出存储过程的列表。右击需要删除的存在右侧的窗口中显示出存储过程的列表。右击需要删除的存储过程,并在弹出菜单中选择【删除】命令,将弹出【除去储过程,并在弹出菜单中选择【删除】命令,将弹出【除去对象】对话框,如图对象】对话框,如图 8-88-8 所示。所示。③在【除去对象】对话框中单击【全部除去】按钮将会完成③在【除去对象】对话框中单击【全部除去】按钮将会完成对存储过程的删除操作。对存储过程的删除操作。

Page 21: 第 8 章  存储过程与触发器

图 8-8 【除去对象】对话框

Page 22: 第 8 章  存储过程与触发器

55 .使用.使用 DROP PROCEDUREDROP PROCEDURE 语句删除存储过程语句删除存储过程使用使用 DROP PROCEDUREDROP PROCEDURE 语句可以从当前的数据库中删除语句可以从当前的数据库中删除一个或多个存储过程。一个或多个存储过程。 DROP PROCEDUREDROP PROCEDURE 语句的语法格语句的语法格式为:式为:DROP PROCEDURE { DROP PROCEDURE { 存储过程名称存储过程名称 } [ ,...} [ ,...n n ]]【例【例 8-48-4 】同时删除当前数据库中的两个存储过程,】同时删除当前数据库中的两个存储过程, proc_aproc_a和和 proc_bproc_b 。。在查询分析器中运行如下命令,即可完成删除操作:在查询分析器中运行如下命令,即可完成删除操作:DROP PROCEDURE proc_a , proc_bDROP PROCEDURE proc_a , proc_bGOGO

Page 23: 第 8 章  存储过程与触发器

8.2 8.2 触发器触发器8.2.1 8.2.1 触发器及其作用触发器及其作用11 .触发器简介.触发器简介 触发器属于一种特殊的存储过程,可以在其中包含复杂触发器属于一种特殊的存储过程,可以在其中包含复杂的的 SQLSQL 语句。触发器与存储过程的区别在于触发器能够自动语句。触发器与存储过程的区别在于触发器能够自动执行并且不含有参数。通常可以在触发器内编写一段自动执执行并且不含有参数。通常可以在触发器内编写一段自动执行的程序,用于保证数据操作的完整性,从而扩展了对默认行的程序,用于保证数据操作的完整性,从而扩展了对默认值、约束和规则的完整性检查。对表进行包括添加数据、删值、约束和规则的完整性检查。对表进行包括添加数据、删除数据、更新数据中的一种或多种操作时,触发器就会自动除数据、更新数据中的一种或多种操作时,触发器就会自动执行。执行。 触发器可以划分为三种类别: 触发器可以划分为三种类别: INSERTINSERT触发器、触发器、 DELETDELETEE触发器、触发器、 UPDATEUPDATE触发器。这三种触发器分别在发生数据触发器。这三种触发器分别在发生数据的添加、删除、修改行为时自动执行。的添加、删除、修改行为时自动执行。

Page 24: 第 8 章  存储过程与触发器

2.触发器的优点 触发器有助于在添加、更新或删除表中的记录时保留表之间已定义的关系。

触发器可以自动调用,当发生了对数据所作的任何修改时,与之相关的触发器就会立刻被激活。

可以完成数据库中相关表之间的级联修改。级联修改是指为了保证数据之间的逻辑性以及依赖关系,在对一张表进行修改的同时,其他表中需要进行的修改能够自动实现。

触发器可以对需要存储的数据加以限制,并且能够实现比 CHECK约束更为复杂的功能。在 CHECK约束中不允许引用其他表中的列,而触发器可以引用。

3 .触发方式 触发器的触发方式可以分为后触发和替代触发两种方式。后触发:指能够引发触发器的修改操作在完成之后才执行触发器的行为方式。创建该类触发器,需要使用 AFTER关键字或者 FOR关键字。

Page 25: 第 8 章  存储过程与触发器

替代触发:指定执行一个触发器,而不是执行替代触发:指定执行一个触发器,而不是执行 SQLSQL 语句,这语句,这种替代触发语句的方式称为替代触发方式。种替代触发语句的方式称为替代触发方式。

8.2.3 创建触发器可以使用企业管理器以及 CREATE TRIGGER 语句两种方式来创建触发器。1 .使用企业管理器创建触发器①打开企业管理器,在控制台根目录下依次展开服务器组、服务器节点、数据库节点。②选择某一个数据库,并双击【表】节点,在右侧窗口的列表中选择其中的一张表。③右击所选中的表,在弹出的下拉菜单中选择【所有任务】,并继续选择级联菜单中的【管理触发器】命令,将打开图 8-9所示的【触发器属性】对话框。

Page 26: 第 8 章  存储过程与触发器

图 8-9 【触发器属性】对话框

Page 27: 第 8 章  存储过程与触发器

④④在【触发器属性】对话框的文本框中,将在【触发器属性】对话框的文本框中,将 [TRIGGER NAM[TRIGGER NAME]E] 修改为新建触发器的名称,并输入触发器所包含的修改为新建触发器的名称,并输入触发器所包含的 SQLSQL 语语句。句。⑤通过点击【检查语法】按钮来判断触发器的语法是否正确,⑤通过点击【检查语法】按钮来判断触发器的语法是否正确,最后,点击【确定】按钮保存新建的触发器。最后,点击【确定】按钮保存新建的触发器。22 .使用.使用 CREATE TRIGGERCREATE TRIGGER 语句创建触发器语句创建触发器CREATE TRIGGERCREATE TRIGGER 语句的部分语法格式:语句的部分语法格式:CREATE TRIGGER CREATE TRIGGER 触发器名称触发器名称 ON { ON { 表名 表名 | | 视图名视图名 } } [ WITH ENCRYPTION ] [ WITH ENCRYPTION ] FOR | AFTER | INSTEAD OF [DELETE] [,] [INSERT] [,] [U FOR | AFTER | INSTEAD OF [DELETE] [,] [INSERT] [,] [UPDATE]PDATE]ASAS SQL SQL 语句语句 [[ ......n n ]]

Page 28: 第 8 章  存储过程与触发器

其中: 触发器名称 必须符合标识符命名规则,并且在同一个数

据库中触发器的名称不允许重复。触发器名称中可以省略所有者名称。

表名或视图名称 是指建立触发器所依赖的对象。也可以称为触发器表或触发器视图。

WITH ENCRYPTION 该选项的作用为对触发器中所包含的 SQL 语句进行加密。

FOR 或 AFTER 代表后触发方式,即当满足所有的引用级联操作和约束检查后并且完成了 SQL 语句中指定的所有操作后,指定的触发器才会被执行。在视图上不允许采用后触发方式。

INSTEAD OF 表示替代触发方式,每一个 INSERT 、 UPDATE 、 DELETE 语句只能定义一个 INSTEAD OF 触发器。

Page 29: 第 8 章  存储过程与触发器

DELETE 、 INSERT 、 UPDATE 三个选项中应该至少选择其一,用于表示在表或视图上执行了哪一类的操作时会将触发器激活。

SQL 语句 为触发器中包含的条件以及需要执行的操作。 在执行触发器时,系统会自动创建两张临时表 INSERTED 、

DELETED ,这两张表的结构与触发器所依赖的表类似,用于保存在用户操作过程中被插入或被删除的数据。每一个触发器在执行过程中都会产生与之相关的上述两张临时表,并且在执行结束后,两个临时表会自动被系统删除。对临时表可以进行查询操作,如 SELECT * FROM DELETED ,但是不能对临时表进行修改

Page 30: 第 8 章  存储过程与触发器

【【例例 8-58-5 】在数据库】在数据库 XSCJXSCJ 中设计一个触发器,该触发器的作中设计一个触发器,该触发器的作用为:当在班级表中删除某一个班级时,在学生基本信息表中用为:当在班级表中删除某一个班级时,在学生基本信息表中该班级所包含的学生信息也全部被删除。该班级所包含的学生信息也全部被删除。提示:在此例中,由于涉及到了班级表的删除操作,因而需要提示:在此例中,由于涉及到了班级表的删除操作,因而需要设计一个设计一个 DELETEDELETE类型的触发器。类型的触发器。在查询分析器中运行如下命令:在查询分析器中运行如下命令:USE XSCJUSE XSCJGOGOCREATE TRIGGER del_bj ON CREATE TRIGGER del_bj ON 班级表班级表AFTER DELETEAFTER DELETEASAS DELETE FROM DELETE FROM 学生基本信息表 学生基本信息表 WHERE WHERE 班级编号班级编号 IN (SELECT IN (SELECT 班级编号 班级编号 FROM DELETED)FROM DELETED)GOGO运行结果如图运行结果如图 8-108-10 所示。所示。

Page 31: 第 8 章  存储过程与触发器

图 8-10 一个 DELETE类型的触发器

【例 8-6 】在数据库 XSCJ 中设计一个触发器,该触发器能够保证在学生基本信息表中添加新的纪录时,新学生的班级编号必须已经存在于班级表中。

Page 32: 第 8 章  存储过程与触发器

提示:设计该触发器有助于实现学生信息的完整性。在此例中提示:设计该触发器有助于实现学生信息的完整性。在此例中由于涉及到了学生基本信息表中的添加操作,因而需要设计一由于涉及到了学生基本信息表中的添加操作,因而需要设计一个个 INSERTINSERT类型的触发器。类型的触发器。在查询分析器中运行如下命令:在查询分析器中运行如下命令:

USE XSCJGOCREATE TRIGGER insert_xs ON 学生基本信息表AFTER INSERTAS IF EXISTS ( SELECT * FROM INSERTED WHERE 班级编号 IN (SELECT 班级编号 FROM 班级表 ) ) PRINT ' 添加成功! ' ELSE BEGIN PRINT '班级编号与现有的班级不符! ' ROLLBACK TRANSACTION END

Page 33: 第 8 章  存储过程与触发器

运行结果如图运行结果如图 8-118-11 所示。所示。

图 8-11 一个 INSERT类型的触发器

Page 34: 第 8 章  存储过程与触发器

创建了触发器创建了触发器 insert_xsinsert_xs 之后,我们可以添加新的学生纪录进之后,我们可以添加新的学生纪录进行测试,例如:行测试,例如:INSERT INTO INSERT INTO 学生基本信息表 学生基本信息表 ((学号学号 ,, 姓名姓名 ,, 性别性别 ,, 族别族别 ,, 班班级编号级编号 ) VALUES('000108',') VALUES('000108',' 王松涛王松涛 ','','男男 ','','汉汉 ','20081001')','20081001')由于“班级表”中不存在编号为由于“班级表”中不存在编号为 2008100120081001 的班级,因而添加的班级,因而添加操作将会被取消。操作将会被取消。 ROLLBACK TRANSACTIONROLLBACK TRANSACTION 用于回滚已经用于回滚已经完成的操作。运行结果如图完成的操作。运行结果如图 8-128-12 所示。所示。

图 8-12 添加操作被取消

Page 35: 第 8 章  存储过程与触发器

8.2.4 8.2.4 修改与删除触发器修改与删除触发器11 .使用企业管理器修改触发器.使用企业管理器修改触发器①在控制台根目录下依次展开服务器组、服务器节点、数据①在控制台根目录下依次展开服务器组、服务器节点、数据库节点。库节点。②选择某一个数据库,并双击【表】节点,在右侧窗口的列②选择某一个数据库,并双击【表】节点,在右侧窗口的列表中选择某一张需要对其所建立的触发器进行修该的表。表中选择某一张需要对其所建立的触发器进行修该的表。③右击所选中的表,在弹出的下拉菜单中选择【所有任务】,③右击所选中的表,在弹出的下拉菜单中选择【所有任务】,并继续选择级联菜单中的【管理触发器】命令,将打开【触并继续选择级联菜单中的【管理触发器】命令,将打开【触发器】属性对话框,如图发器】属性对话框,如图 8-138-13 所示。所示。④在【触发器属性】对话框中,在【名称】下拉列表框选择④在【触发器属性】对话框中,在【名称】下拉列表框选择一个已有的触发器,并在【文本】编辑框中对其所包含的一个已有的触发器,并在【文本】编辑框中对其所包含的 SSQLQL 语句进行修改。语句进行修改。

Page 36: 第 8 章  存储过程与触发器

图 8-13 【触发器】属性对话框

Page 37: 第 8 章  存储过程与触发器

⑤⑤在语法检查无误的情况下,点击【确定】按钮保存修改。在语法检查无误的情况下,点击【确定】按钮保存修改。⑥如果需要删除当前触发器,可以点击【删除】按钮。⑥如果需要删除当前触发器,可以点击【删除】按钮。22.使用.使用 ALTER TRIGGERALTER TRIGGER 语句修改触发器语句修改触发器ALTER TRIGGERALTER TRIGGER 语句与语句与 CREATE TRIGGERCREATE TRIGGER 语句的语法语句的语法格式及其参数类似,部分语法格式为:格式及其参数类似,部分语法格式为:ALTER TRIGGER ALTER TRIGGER 触发器名称触发器名称 ON { ON { 表名 表名 | | 视图名视图名 } } [ WITH ENCRYPTION ] [ WITH ENCRYPTION ] FOR | AFTER | INSTEAD OF [DELETE] [,] [INSERT] [,] FOR | AFTER | INSTEAD OF [DELETE] [,] [INSERT] [,] [UPDATE][UPDATE]ASAS SQL SQL 语句语句 [[ ......n n ]]

Page 38: 第 8 章  存储过程与触发器

【【例例 8-78-7 】修改】修改 del_bjdel_bj触发器,使得在班级表中删除某一个触发器,使得在班级表中删除某一个班级时,不仅在学生基本信息表中该班级所包含的学生信息班级时,不仅在学生基本信息表中该班级所包含的学生信息将被删除,而且在成绩表中与学生相关的数据也将被删除。将被删除,而且在成绩表中与学生相关的数据也将被删除。在查询分析器中运行如下命令:在查询分析器中运行如下命令:ALTER TRIGGER del_bj ON ALTER TRIGGER del_bj ON 班级表班级表AFTER DELETEAFTER DELETEASAS DELETE FROM DELETE FROM 成绩表 成绩表 WHERE WHERE 学号学号 IN (SELECT IN (SELECT 学号 学号 FROM FROM 学生基本信息表 学生基本信息表 WHERE WHERE 班级班级编号编号 IN (SELECT IN (SELECT 班级编号 班级编号 FROM DELETED))FROM DELETED)) DELETE FROM DELETE FROM 学生基本信息表 学生基本信息表 WHERE WHERE 班级编号班级编号 IN (SELECT IN (SELECT 班级编号 班级编号 FROM DELETED)FROM DELETED)运行结果如图运行结果如图 8-148-14 所示。所示。

Page 39: 第 8 章  存储过程与触发器

图 8-14 修改 del_bj触发器

3 .使用 DROP TRIGGER 语句删除触发器移除触发器时,与触发器有关的信息将从 sysobjects 和 syscomments 系统表中删除。可以通过删除触发器或删除表两种方式移除触发器。删除表时,将除去所有与表相关联的触发器。

Page 40: 第 8 章  存储过程与触发器

DROP TRIGGERDROP TRIGGER 语句的语法格式为:语句的语法格式为:DROP TRIGGER DROP TRIGGER 触发器名称 触发器名称 [ [ ,,......n n ]]触发器名称为数据库中现有的触发器。可以指定一个或多个触发器名称为数据库中现有的触发器。可以指定一个或多个触发器名称来删除一个或多个触发器。触发器名称来删除一个或多个触发器。

【例 8-8 】删除触发器 del_bj 以及 insert_xs 。在查询分析器中运行如下命令:USE XSCJGODROP TRIGGER del_bj , insert_xs运行结果如图 8-15 所示。

Page 41: 第 8 章  存储过程与触发器

图 8-15 删除触发器 del_bj 以及 insert_xs

Page 42: 第 8 章  存储过程与触发器

本章小结本章小结本章学习了存储过程与触发器的相关知识,本章学习了存储过程与触发器的相关知识,存储过程中可以将多条存储过程中可以将多条 SQLSQL 语句集中在一起语句集中在一起完成复杂的功能,从而用户可以在不具有对完成复杂的功能,从而用户可以在不具有对数据对象访问的权限下调用这些存储过程完数据对象访问的权限下调用这些存储过程完成的特定的操作。触发器可以帮助用户完成成的特定的操作。触发器可以帮助用户完成数据的验证功能,从而能够保证数据的一致数据的验证功能,从而能够保证数据的一致性、完整性。性、完整性。

Page 43: 第 8 章  存储过程与触发器

练习与上机练习与上机一.选择题一.选择题11.下面关于存储过程的描述中哪些是正确的( ).下面关于存储过程的描述中哪些是正确的( )AA.自定义存储过程与系统存储过程名称可以相同.自定义存储过程与系统存储过程名称可以相同BB.存储过程最多能够支持.存储过程最多能够支持 6464 层的嵌套层的嵌套CC.命名存储过程中的标识符时,长度不能超过.命名存储过程中的标识符时,长度不能超过 256256 个字符个字符DD.存储过程中参数的个数不能超过.存储过程中参数的个数不能超过 2100210022.用于创建存储过程的.用于创建存储过程的 SQLSQL 语句为( )语句为( )AA.. CREATE DATABASE BCREATE DATABASE B.. CREATE TRIGGERCREATE TRIGGERCC.. CREATE PROCEDURE DCREATE PROCEDURE D.. CREATE TABLECREATE TABLE33.用于修改存储过程的.用于修改存储过程的 SQLSQL 语句为( )语句为( )AA.. ALTER TABLE BALTER TABLE B .. ALTER DATABASEALTER DATABASECC.. ALTER TRIGGER DALTER TRIGGER D .. ALTER PROCEDUREALTER PROCEDURE

Page 44: 第 8 章  存储过程与触发器

44.下列对触发器的描述中哪一个是错误的( ).下列对触发器的描述中哪一个是错误的( )AA.触发器属于一种特殊的存储过程.触发器属于一种特殊的存储过程BB.触发器与存储过程的区别在于触发器能够自动执行并且.触发器与存储过程的区别在于触发器能够自动执行并且不含有参数不含有参数CC.触发器有助于在添加、更新或删除表中的记录时保留表.触发器有助于在添加、更新或删除表中的记录时保留表之间已定义的关系之间已定义的关系DD.既可以对.既可以对 INSERTEDINSERTED 、、 DELETEDDELETED临时表进行查询,也临时表进行查询,也可以进行修改可以进行修改

Page 45: 第 8 章  存储过程与触发器

二.填空题二.填空题11.一个存储过程的名称不能超过.一个存储过程的名称不能超过 ______________ 个字符。个字符。22.使用.使用 ______________ 语句可以对存储过程进行重命名。语句可以对存储过程进行重命名。33.触发器有.触发器有 ______________ 、、 ______________触发方式。触发方式。44.用.用 __________________ 语句可以删除触发器。语句可以删除触发器。55.触发器可以划分为三种类别.触发器可以划分为三种类别 ________________________ 、、 ________________________ 、、 ________________________ 。。三.简答题三.简答题11.简述什么是存储过程?.简述什么是存储过程?22.简要说明存储过程的语法格式?.简要说明存储过程的语法格式?33.简述什么是触发器?.简述什么是触发器?44.简要说明触发器的语法格式?.简要说明触发器的语法格式?

Page 46: 第 8 章  存储过程与触发器

项目实训项目实训11.创建一个存储过程,该存储过程能够实现根据系部的编.创建一个存储过程,该存储过程能够实现根据系部的编号查询出系部中男生、女生的人数。号查询出系部中男生、女生的人数。22.创建一个.创建一个 INSERTINSERT触发器,该触发器能够在向成绩表中触发器,该触发器能够在向成绩表中添加数据时,自动判断学号、课程编号、成绩是否合法,如添加数据时,自动判断学号、课程编号、成绩是否合法,如果非法则对插入操作进行回滚。果非法则对插入操作进行回滚。33.在.在 pubspubs 数据库中创建一个名为数据库中创建一个名为 proc_test1proc_test1 的存储过程,的存储过程,执行的功能是从执行的功能是从 authorsauthors 和和 titlestitles表里查询出作者的信息以表里查询出作者的信息以及该作者所写的所有书的信息。及该作者所写的所有书的信息。44.建立一个存储过程级联来修改.建立一个存储过程级联来修改 pubspubs 数据库的数据库的 authorsauthors 、、titleauthortitleauthor 两张表,当用户修改两张表,当用户修改 authorsauthors表中的表中的 au_idau_id 后,后,修改修改 titleauthorstitleauthors表中对应的数据。表中对应的数据。