存储过程和触发器.ppt

上传人:pu****.1 文档编号:570130248 上传时间:2024-08-02 格式:PPT 页数:57 大小:1.87MB
返回 下载 相关 举报
存储过程和触发器.ppt_第1页
第1页 / 共57页
存储过程和触发器.ppt_第2页
第2页 / 共57页
存储过程和触发器.ppt_第3页
第3页 / 共57页
存储过程和触发器.ppt_第4页
第4页 / 共57页
存储过程和触发器.ppt_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《存储过程和触发器.ppt》由会员分享,可在线阅读,更多相关《存储过程和触发器.ppt(57页珍藏版)》请在金锄头文库上搜索。

1、第第10章章 存储过程、触发器存储过程、触发器主讲教师:卫琳主讲教师:卫琳存储过程、触发器和游标是SQL Server数据库的三个重要组成部分。SQL Server 2008使用它们从不同方面提高数据处理能力。在SQL Server 2008中,可以像其他程序设计语言一样定义子程序,称为存储过程。存储过程是SQL Server 2008提供的最强大的工具之一。理解并运用它,可以创建健壮、安全且具有良好性能的数据库,可以为用户实现最复杂的商业事务。触发器是一种特殊类型的存储过程:它通过事件触发而被自动执行。自动执行意味着更少的手工操作以及更小的出错机率。触发器用于强制复杂的完整性检查,审核更改,

2、维护不规范的数据等等。SQL Server 2008允许DML语句和DDL语句创建触发器,可以引发AFTER或者INSTEAD OF触发事件。游标主要用于实现一些不能使用面向集合的语句实现的操作。通过游标,SQL Server提供了一个对结果集进行逐行处理的能力。可以把游标看为一种特殊的指针,它可以指向结果集中的任意位置,在查询数据的同时对数据进行处理。本章学习目标:本章学习目标:了解存储过程、触发器和游标的基本概念与特点掌握存储过程的基本类型和相关操作掌握触发器的类型与相关操作10.1 存储过程存储过程通过前面的学习,我们能够编写并运行T-SQL程序以完成各种不同的应用。保存T-SQL程序的

3、方法有两种:一种是在本地保存程序的源文件,运行时先打开源文件再执行程序;另一种方法即将程序存储为存储过程,运行时调用存储过程执行。因为存储过程是由一组T-SQL语句构成的,要使用存储过程,我们必需熟悉前面几章所讨论的基本的T-SQL语句,并且需要了解掌握一些关于函数、过程的概念。10.1.1 存储过程的基本概念存储过程的基本概念存储过程是事先编好的、存储在数据库中一组被编译了的T-SQL命令集合,这些命令用来完成对数据库的指定操作:存储过程可以接收用户的输入参数、向客户端返回表格或标量结果和消息、调用数据定义语言 (DDL) 和数据操作语言 (DML) 语句,然后返回输出参数。通过定义可以看到

4、,存储过程起到了我们在其他语言中所说的子程序的作用,我们可以将经常执行的管理任务或者复杂的业务规则,预先用T-SQL语句写好并保存为存储过程, 当需要数据库提供与该存储过程的功能相同的服务时,只需要使用EXECUTE命令,即可调用存储过程完成命令。存储过程的优点:存储过程的优点:1. 减少网络流量:存储过程在数据库服务器端执行,只向客户端返回执行结果。因此可以将在网络中要发送的数百行代码,编写为一条存储过程,这样客户端只需要提交存储过程的名称和参数,即可实现相应功能,节省了网络流量,提高了执行的效率。此外,由于所有的操作都在服务器端完成,避免了在客户端和服务器端之间的多次往返。存储过程只需要将

5、最终结果通过网络传输到客户端。2. 提高系统性能:一般T-SQL语句每执行一次就需要编译一次,而存储过程只在创建时进行编译,被编译后存放在数据库服务器的过程高速缓存中,当使用时,服务器不必再重新分析和编译它们。因此,当对数据库进行复杂操作时(如对多个表进行UPDATE、INSERT或DELETE操作时),可将这些复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用,节省了分析、解析和优化代码所需的CPU资源和时间。3. 安全性高:使用存储过程可以完成所有数据库操作,并且可授予没有直接执行存储过程中语句的权限的用户,也可执行该存储过程的权限。另外可以防止用户直接访问表,强制用户使用存储过

6、程执行特定的任务。4. 可重用性:存储过程只需创建并存储在数据库中,以后即可任意在程序中调用该过程。存储过程可独立于程序源代码而单独修改,减少数据库开发人员的工作量。5. 可自动完成需要预先执行的任务:存储过程可以在系统启动时自动执行,完成一些需要预先执行的任务,而不必在系统启动后再进行人工操作。10.1.2 存储过程的类型存储过程的类型1. 系统存储过程系统存储过程2. 扩展存储过程扩展存储过程3.用户存储过程用户存储过程用户存储过程在用户数据库中创建,通常与数据库对象进行交互,用于完成特定数据库操作任务,可以接受和返回用户提供的参数,名称不能以sp_为前缀。在SQL Server 2008

7、中,用户存储过程有两种类型:Transact-SQL存储过程和clr存储过程。Transact-SQL存储过程保存T-SQL语句的集合,可以接受和返回用户提供的参数,也可以从数据库向客户端应用程序返回数据;CLR存储过程是指对Microsoft.NET Framework公共语言运行时方法的引用,可以接受和返回用户提供的参数。它们在.NET Framework程序集中是作为类的公共静态方法实现的use testgocreate procedure student_infoasselect student.sno,sname,cname,gradefrom student,sc,coursewh

8、ere student.sno=sc.snoand o=ogo示例:创建一个存储过程,返回学生学号,姓名,课程名,成示例:创建一个存储过程,返回学生学号,姓名,课程名,成绩信息。绩信息。1.存储过程不使用任何参数存储过程不使用任何参数10.1.3 存储过程创建与执行存储过程创建与执行use testgocreate procedure student_info2xm varchar(8),kcm varchar(50)asselect student.sno,sname,cname,gradefrom student,sc,coursewhere student.sno=sc.snoand o

9、=oand sname=xmand cname=kcmgo示例:创建一个存储过程,返回学生学号,姓名,课程名,成示例:创建一个存储过程,返回学生学号,姓名,课程名,成绩信息。接受与传递参数精确匹配的值。绩信息。接受与传递参数精确匹配的值。2.存储过程使用带有输入参数的存储过程存储过程使用带有输入参数的存储过程1) 按位置传送参数值按位置传送参数值exec student_info2 李明,高等数学2)使用参数名传送使用参数名传送exec student_info2 xm=李明,kcm=高等数学exec student_info2 kcm=高等数学,xm=李明存储过程调用形式存储过程调用形式示例

10、:新建一个存储过程,该存储过程定义了两个日期时间类型的输入参数和一个字符型输入参数,返回所有出生日期在两个输入日期之间,性别与输入的字符型参数相同的学生信息,其中字符型输入参数指定的默认值为“女”。use testgocreate procedure stud_info3startdate date,enddate date,sex char(2)=女asif (startdate is null or enddate is nullor sex is null)beginraiserror(null value are invalid,5,5)returnendselect *from st

11、udentwhere sbirth between startdate and enddateand ssex=sexorder by sbirthgouse testexec stud_info3 1991-1-1,1992-12-313.使用带有通配符参数的存储过程使用带有通配符参数的存储过程创建一个存储过程,返回学生学号,姓名,课程名,成绩。该存储过程使用了模糊匹配,如果没有提供参数,则使用预设的默认值。if exists(select name from sysobjects where name=student_info3 and type=P) drop procedure stu

12、dent_info3gocreate procedure student_info3xm varchar(8)=刘%asselect student.sno,sname,cname,gradefrom student join sc join courseon o=oon student.sno=sc.sno where sname like xmgoexecute student_info3 王张% 4.使用带有使用带有output参数的存储过程参数的存储过程例:用于返回输入特定学生的单科成绩平均分。此存储过程有一个输入和输出参数。例:用于返回输入特定学生的单科成绩平均分。此存储过程有一个输

13、入和输出参数。use testgoif exists(select name from sysobjects where name=student_info4 and type=p) drop procedure student_info4gocreate procedure student_info4xm varchar(8),pjf tinyint outputasselect pjf=AVG(grade)from student join scon student.sno=sc.snowhere sname=xmgodeclare pjf tinyint exec student_inf

14、o4 邓立新邓立新,pjf outputselect 邓立新邓立新,pjfgoOutput变量必需在创建存储变量必需在创建存储过程和使用该变量时都进行过程和使用该变量时都进行定义。定义。use testgocreate procedure stud_infostartdate date,enddate date,recordcount int outputasif (startdate is null or enddate is null)beginraiserror(null value are invalid,5,5)returnendselect *from studentwhere s

15、birth between startdate and enddateorder by sbirthselect recordcount=ROWCOUNT Go示例:新建一个存储过程,其功能是输入两个日期型数据,并使用输出参数返回这两个出生日期之间的所有学生人数。4.使用带有使用带有output参数的存储过程参数的存储过程declare recordcount intexec stud_info 1991-1-1,1992-12-31,recordcount outputselect recordcount as 人数go其中,ROWCOUNT是SQL Server用来返回受上一语句影响的行数

16、的系统变量,在这里用它来返回符合条件记录数。create procedure encrypt_this with encryptionasselect * from studentGoexec sp_helptext encrypt_this 通过系统存储过程通过系统存储过程sp_helptext可显示规则、默认值、没有可显示规则、默认值、没有加密的存储过程,用户定义的函数、触发器或视图的文本。加密的存储过程,用户定义的函数、触发器或视图的文本。示例:创建一个加密的存储过程示例:创建一个加密的存储过程5.使用使用with encryption选项对用户隐藏存储过程选项对用户隐藏存储过程use

17、mastergocreate procedure sp_showtabletable varchar(30)=xs%asselect sysobjects.name as table_name, sysindexes.name as index_name from sysindexes join sysobjects on sysindexes.id=sysobjects.id where sysobjects.name like tablegouse testexec sp_showtable xs%go6.创建用户自己定义的存储过程创建用户自己定义的存储过程 示例:创建一个过程,显示表名以

18、示例:创建一个过程,显示表名以xs开头的所有表及其索引。如开头的所有表及其索引。如果没有指定参数,此过程返回表名以果没有指定参数,此过程返回表名以kc开头的所有表及对应索引开头的所有表及对应索引 10.1.4 .管理存储过程管理存储过程1.查看存储过程查看存储过程2.修改存储过程修改存储过程3.删除存储过程删除存储过程4.存储过程的重新编译存储过程的重新编译1.查看存储过程查看存储过程示例:use testgoexec sp_helptext stud_procexec sp_depends stud_procexec sp_help stud_proc2.修改存储过程修改存储过程 修改存储过

19、程通常是指编辑它的参数和Transact-SQL语句。下面我们分别说明如何使用对象资源管理器和Transact-SQL语句命令完成这项工作。 1). 使用对象资源管理器使用对象资源管理器 单击“开始”按钮,选择“程序”“Microsoft SQL Server 2008”“SQL Server Management Studio”“对象资源管理器”。 分别展开“数据库”、欲修改存储过程所处的数据库、“可编程性”、“存储过程”、欲修改的存储过程。 右击欲修改存储过程,在弹出菜单中选择“修改”,此时立即在“SQL编辑器”窗格中出现欲修改的存储过程文件。 在“SQL编辑器”中编辑存储过程的参数和Tr

20、ansact-SQL语句。此时,一般不要改变ALTER PROCEDURE语句中的存储过程名称。如果觉得存储过程的重命名以及参数和Transact-SQL语句的编辑要分开来完成很麻烦,可以直接删除存储过程后再重新创建符合要求的存储过程。 编辑了存储过程的参数和Transact-SQL语句之后,单击“SQL编辑器”工具栏上“分析”按钮检查所编写的程序代码语法无误,然后单击“SQL编辑器”工具栏上“执行”按钮完成存储过程的参数和Transact-SQL语句修改。 单击“标准”工具栏上“保存”按钮,以保存修改存储过程的SQL文件。2. 使用使用ALTER PROCEDURE命令命令 具体语法如下:

21、ALTER PROCEDURE procedure_name parameter data_type=DEFAULTOUTPUT ,n WITHRECOMPILE | ENCRYPTION | RECOMPILE,ENCRYTION AS Sql_statement,n 其中,各参数的意义如下: procedure_name为要修改的存储过程的名称,parameter为存储过程中包含的输入和输出参数,data_type指定输入和输出参数的数据类型,default为输入输出参数指定的默认值,必须为一个常量,WITH RECOMPILE为存储过程指定重编译选项,WITH ENCRYPTION是对包

22、含ALTER PROCEDURE文本的syscomments表中的项进行加密。 【示例7.14】修改存储过程teacher_proc1,返回所有性别为“女”的学生学号、姓名、地址、电话等基本信息。并对存储过程指定重编译处理和加密选项。 USE student GO ALTER PROCEDURE teacher_proc1 WITH RECOMPILE, ENCRYPTION AS SELECT teacher_id,name,tech_title,telephone FROM teacher_info WHERE gender = 女 GO 注意:修改具有任何选项,例如WITH RECOMP

23、ILE的存储过程时,必须在ALTER PROCEDURE语句中包括该选项以保留该选项提供的功能;ALTER PROCEDURE语句只能修改一个单一的过程。如果存储过程中调用了其他存储过程,嵌套的存储过程将不受影响。 3. 重新命名存储过程 修改存储过程的名字使用系统存储过程sp_rename,其命令格式为: sp_rename old_procedure_name, new_procedure_name 【示例7.15】将存储过程teacher_proc1修改为teacher_info_proc1。 sp_rename teacher_proc1, teacher_info_proc1 另外,

24、通过对象资源管理器也可修改存储过程的名字,其操作过程与Windows下修改文件名字的操作类似。即首先选中需修改名字的存储过程,然后右击鼠标,在弹出菜单中选取“重命名”选项,最后输入新存储过程的名字。3. 删除存储过程删除存储过程 1). 使用对象资源管理器 使用对象资源管理器删除一个或多个存储过程,请先将它们选取,然后使用鼠标右键按下其中一个被选取的存储过程,并从快捷菜单中选取“删除”命令,接着再用鼠标左键单击“删除对象”对话框中的“确定”按钮。 2). 使用DROP PROCEDURE语句 删除存储过程使用DROP命令,DROP命令可将一个或多个存储过程或者存储过程组从当前数据库中删除。具体

25、语法如下: DROP PROCEDURE procedure_name,n 其中各参数的意义与修改存储过程命令中参数的意义相同。 【示例】将存储过程teacher_info_proc1从数据库中删除。 DROP PROCEDURE teacher_info_proc110.2 触触 发发 器器10.2.1 触发器概述触发器概述1)触发器功能:)触发器功能:l强化约束:强化约束:触发器能够实现比触发器能够实现比CHECK 语句更为复杂的约束:触发器可语句更为复杂的约束:触发器可以很方便地引用其他表的列,去进行逻辑上的检查;触发器是在以很方便地引用其他表的列,去进行逻辑上的检查;触发器是在CHEC

26、K之后执行的;触发器可以插入、删除、更新多行。之后执行的;触发器可以插入、删除、更新多行。l跟踪变化跟踪变化:触发器可以侦测数据库内的操作,从而禁止数据库中未经许:触发器可以侦测数据库内的操作,从而禁止数据库中未经许可的更新和变化,确保输入表中的数据的有效性。例如在库存系统中,触可的更新和变化,确保输入表中的数据的有效性。例如在库存系统中,触发器可以检测到当实际库存下降到了需要再进货的临界量,就给管理员相发器可以检测到当实际库存下降到了需要再进货的临界量,就给管理员相应的提示信息或自动生成给供应商的订单;应的提示信息或自动生成给供应商的订单;l级联运行级联运行:触发器可以侦测数据库内的操作,并

27、自动地级联影响整个数:触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的不同表中的各项内容。例如:设置一个触发器,当据库的不同表中的各项内容。例如:设置一个触发器,当student表中删表中删除一个学号信息时,对应的除一个学号信息时,对应的sc表中相应的学号信息也被改写为表中相应的学号信息也被改写为NULL或删或删除相关学生记录;除相关学生记录;l调用存储过程:调用存储过程:为了响应数据库更新,触发器可以调用一个或多个存储为了响应数据库更新,触发器可以调用一个或多个存储过程。过程。2) 触发器的种类触发器的种类lDML触发器触发器:如果用户要通过数据操作语言如果用户要通过数据操作语言

28、(DML)编辑数据,则执行编辑数据,则执行 DML 触发器。触发器。DML事件是指对表或视图的事件是指对表或视图的 INSERT、UPDATE和和DELETE 语句,即语句,即DML触发器在数据修改时被执行。系统将触发器和触发器在数据修改时被执行。系统将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到错误触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到错误(例如,磁盘空间不足例如,磁盘空间不足),则整个事务自动回滚;,则整个事务自动回滚;lDDL触发器:触发器:为了响应各种数据定义语言为了响应各种数据定义语言 (DDL) 事件而激发。事件而激发。DDL事事件主要与以

29、关键字件主要与以关键字CREATE、ALTER和和DROP开头的开头的T-SQL语句对应。语句对应。它们可用于在数据库中执行管理任务,例如,审核以及规范数据库操作。它们可用于在数据库中执行管理任务,例如,审核以及规范数据库操作。10.2.1 触发器概述触发器概述DML触发器的工作原理现在介绍触发器是如何工作的。通过了解触发器的工作原理,可以更好地使用触发器,写出效率更高的触发器。下面主要介绍INSERT、DELETE和UPDATE类型触发器的工作原理。向表中插入数据时,INSERT触发器触发执行。当INSERT触发器触发时,新的记录增加到触发器表中和inserted表中。inserted表是一

30、个逻辑表,保存了所插入记录的备份,允许用户参考INSERT语句中数据。触发器可以检查inserted表,来确定该触发器的操作是否应该执行和如何执行。在inserted表中的记录,总是触发器表中一行或多行记录的冗余。2024年8月2日第26页DELETE触发器当触发一个DELETE触发器时,被删除的记录放在一个特殊的deleted表中。deleted表是一个逻辑表,用来保存已经从表中删除的记录。该deleted表允许参考原来的DELETE语句删除的已经记录在日志中的数据。2024年8月2日第27页UPDATE触发器修改一条记录就等于插入一条新记录同时删除一条旧记录。同样,UPDATE语句也可以看

31、成是由删除一条记录的DELETE语句和增加一条记录的INSERT语句组成。当在某一个有UPDATE触发器表的上面修改一条记录时,表中原来的记录移动到deleted表中,修改过的记录插入到了inserted表中。触发器可以检查deleted表和inserted表以及被修改的表,以便确定是否修改了多个行和应该如何执行触发器的操作。2024年8月2日第28页10.2.2 DML触发器的创建和应用触发器的创建和应用1. DML触发器的分类触发器的分类(1) AFTER触发器触发器:这类触发器是在记录已经被修改完,相关事务提:这类触发器是在记录已经被修改完,相关事务提交后,才会被触发执行。主要用于记录变

32、更后的处理或检查,一旦交后,才会被触发执行。主要用于记录变更后的处理或检查,一旦发现错误,可以用发现错误,可以用ROLLBACK TRANSACTION语句来回滚本次操语句来回滚本次操作。对于同一个表的操作,可定义多个作。对于同一个表的操作,可定义多个AFTER触发器,并定义各种触发器,并定义各种触发器执行的先后顺序。触发器执行的先后顺序。(2) INSTEAD OF触发器触发器:这类触发器并不去执行其所定义的操作:这类触发器并不去执行其所定义的操作(INSERT、UPDATE、DELETE),而去执行触发器本身所定义的操,而去执行触发器本身所定义的操作。这类触发器一般用来取代原本的操作,在记

33、录变更之前被触发。作。这类触发器一般用来取代原本的操作,在记录变更之前被触发。Sql server 2008为每个触发器语句创建了两种特殊的表:为每个触发器语句创建了两种特殊的表:Delete表表和和inserted表表。这是两个逻辑表,由系统亲自创建及。这是两个逻辑表,由系统亲自创建及维护,用户不能对它们进行修改。它们存放在内存中而不是数维护,用户不能对它们进行修改。它们存放在内存中而不是数据库中。据库中。 这两个表的结构总是与被该触发器作用的表结构相同这两个表的结构总是与被该触发器作用的表结构相同.触发器执行完成后,与该触发器相关的这两个表也会被删除。触发器执行完成后,与该触发器相关的这两

34、个表也会被删除。10.2.2 DML触发器的创建和应用触发器的创建和应用2. 触发器中的逻辑触发器中的逻辑(虚拟虚拟)表表Delete表:表:存放由执行存放由执行delete或或update语句而要从表语句而要从表中删除的所有行。在执行中删除的所有行。在执行delete或或update操作时,被操作时,被删除的行从触发器有中被移动到删除的行从触发器有中被移动到Delete表中,这两个表中,这两个表不会有相同的行。表不会有相同的行。Inserted表:表:存放由执行存放由执行insert或或update语句而要向语句而要向表中插入的所有行。在执行表中插入的所有行。在执行insert或或updat

35、e操作时,操作时,新的行同时添加到触发器表和新的行同时添加到触发器表和inserted表中,表中, Inserted表的内容是触发器表中新行的副本。表的内容是触发器表中新行的副本。create trigger stu_trigon studentfor updateasif update(sno)beginraiserror(不能修改学号!,10,1)rollback endgoraiserror返回用户定义的错误信息时,可指定严重级别,设置系统变量记录所发生的错误,语法如下:raiserror(msg_id|msg_str|locla_variable),severity,state,arg

36、ument,.nwith option,.n其中msg_id在sysmessages系统表中指定的用户定义错误信息msg_str:用户定义的信息。该错误最长可到达2047个字符serverity:用户定义的与该消息的严重级别。任何用户都可以指定0-18之间的严重级别,只有sysadmin固定服务器角色成员或具有alter trace权限的用户才能指定19到25之间的级别。raiserror(ls_mess,10,1) -这个是输出错误信息。 RAISERROR 可以替代 PRINT 将消息返回到调用应用程序。RAISERROR 支持类似于 C 标准库中 printf 函数功能的字符替代,而 T

37、ransact-SQL PRINT 语句则不支持。PRINT 语句不受 TRY 块的影响,而在严重级别为 11 到 19 的情况下在 TRY 块中运行的 RAISERROR 会将控制传输至关联的 CATCH 块。指定严重级别为 10 或更低以使用 RAISERROR 返回 TRY 块中的消息,而不必调用 CATCH 块。其中:ls_mess 是消息内容10 是错误的级别1 是状态create table salary_table(id int identity primary key, salary money, percent numeric(2,1), realsalary money)G

38、ocreate trigger salary_trigon salary_tableinstead of insertasdeclare salary money,percent numeric(2,1)select salary=salary,percent=percentfrom insertedinsert into salary_table(salary,percent,realsalary)values(salary,percent,salary*(1-percent) insert into salary_table(salary,percent)values(1500,0.2)示

39、例:利用示例:利用instead of 触发器实现工资的自动计算。触发器实现工资的自动计算。create trigger stu_d_upon studentafter update,deleteasif update(sno)beginupdate scset sno=(select sno from inserted)where sno=(select sno from deleted)print getdate()print 修改结束endelsebegindelete from scwhere sno=(select sno from deleted)print getdate()pr

40、int 删除结束endprint trigger end!print getdate()go直接递归:直接递归:触发器初步激活并执行一个操作时,该操作又使用同一个触发器初步激活并执行一个操作时,该操作又使用同一个触发器现执行操作触发器现执行操作.use testgocreate trigger trig_stuon studentfor deleteasdeclare sex char(2)select sex=ssex from deleteddelete studentwhere ssex=sexGodelete from studentwhere sname=汪远东use testgoi

41、f exists(select name from sysobjects where name=reminder and type=tr) drop trigger remindergocreate trigger reminderon studentfor insert,update,deleteasprint 您不能更新数据!rollbackgo当有人试图更新学生表中的数据时,向客户显示一条信息一个DML触发器示例为了更加全面地掌握开发触发器的步骤和技术,本节通过一个具体的示例,全面讲述使用Transact-SQL语言开发和创建触发器的技术。一般地,开发触发器的过程包括用户需求分析、确定触

42、发器的逻辑结构、编写触发器代码和测试触发器。2024年8月2日第40页创建accountData表2024年8月2日第41页创建auditAccountData表 创建t_accountData_insert触发器 创建t_accountData_delete触发器 一组插入数据的操作 审计到的插入数据的操作 一组删除数据的操作 审计到的删除数据的操作 DDL 触发器 DDL触发器与DML触发器有许多类似的地方,都可以自动触发完成规定的操作或使用CREATE TRIGGER语句创建等,但是也有一些不同的地方。例如,DDL触发器的触发事件主要是CREATE、ALTER、DROP以及GRANT、D

43、ENY、REVOKE等语句,并且触发的时间条件只有AFTER,没有INSTEAD OF。CREATE TRIGGER创建DDL触发器的CREATE TRIGGER语句的基本语法形式如下:CREATE TRIGGER trigger_name ON ALL SERVER | DATABASE WITH ENCRYPTION FOR | AFTER event_type AS sql_statement定义一个DDL触发器 删除表的操作失败 use testgocreate trigger mytrigon all serverfor create_loginasprint 对不起,您无权限创建登

44、录!rollbackgocreate login xingminwith password=12345610.2.4 查看、修改和删除触发器查看、修改和删除触发器1. 查看数据库中已有触发器查看数据库中已有触发器查看表中已有哪些触发器,这些触发器究竟对表有哪些操作,我们需要能够查看触发其信息。查看触发器有两种常用方法:(1)使用)使用SQL Server 2008的的SSMS查看触发器查看触发器信息信息在SQL Server 2008中,展开服务器和数据库,此处我们选择展开stuinfo数据库。选择表student,展开触发器选项,即看到建立的触发器。右击触发器,从弹出的快捷菜单中选择修改,即

45、可看到触发器的源代码。 (2)使用系统存储过程查看触发器)使用系统存储过程查看触发器由于触发器为一种特殊的存储过程,我们可以使用前面介绍的系统存储过程sp_help和sp_helptext来查看触发器信息。sp_help:用于查看触发器的一般信息,如触发器的名称、属性、类型和创建时间等。格式为:EXECUTE sp_help 触发器名称;sp_helptext:用于查看触发器的T-SQL代码信息。格式为:EXECUTE sp_helptext 触发器名称查看数据库中所有触发器信息要使用sysobjects表来辅助完成,语句为:SELECT *FROM sysobjects WHERE xtyp

46、e=TR2. 修改数据库中已有触发器修改数据库中已有触发器修改触发器也可以在SQL Server 2008的SSMS中完成,步骤与查看触发器信息一致。使用T-SQL语句修改触发器要区分是DML类触发器还是DDL类触发器,修改格式分别为:(1)修改DML触发器ALTER TRIGGER 触发器名称ON table | view FOR |AFTER | INSTEAD OF INSERT , UPDATE , DELETE AS SQL语句,n(2)修改DDL触发器ALTER TRIGGER 触发器名称ON ALL SERVER| DATABASE FOR |AFTER 事件类型|事件组,nAS SQL语句,n3. 删除触发器:删除触发器:系统提供三种方法来删除触发器:(1)在SQL Server 2008的SSMS中完成,右击待删除的触发器,从弹出的快捷菜单中选择删除命令。(2)删除触发器所在的表。在删除表时,系统会自动删除与该表相关的触发器。(3)使用T-SQL语句DROP TRIGGER删除触发器。基本语句格式为:DROP TRIGGER 触发器名称,n

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号