《sqlserver创建存储过程和触发器.ppt》由会员分享,可在线阅读,更多相关《sqlserver创建存储过程和触发器.ppt(53页珍藏版)》请在三一办公上搜索。
1、第 7 章创建存储过程和触发器,存储过程概述 创建存储过程执行存储过程查看、重命名和删除存储过程创建带有参数的存储过程触发器概述DML触发器的创建和应用DDL触发器的创建和应用 嵌套触发器和递归触发器查看、修改和删除触发器,存储过程概述,任务演示:小张的学校为进一步提高师资质量,开展了网上评教活动,通过学生反映老师的授课情况。活动结束后,教务部门将通过学生对老师的评教信息进行汇总,再对每位老师进行综合评定。这些信息将记录在数据库的 tblRemarks 表中,教务部门根据网上的数据开展工作。他们开始汇总每位老师的评价信息,该 tblRemarks 表是以学生评教ID为主键的,中间存储的是同学对
2、老师的不同信息。该表内容如下:,管理任务:从 tblRemarks 表中可以看,教务处如果直接对其汇总工作量很大,因为他们必须逐一统计教师的信息。为减轻负担,小张以 tblRemarks表收集的数据为基础,以每位老师作为一条记录进行存储,以便汇总。你能想到什么方案呢?小张想到了如下几种方案:1、直接对 tblRemarks 表进行修改。(好与坏?)2、创建一个用户定义函数,以实现参数化的视图功能;(好与坏?)3、创建一个存储过程,以实现对现有的评教信息进行汇总。(好与坏?),小张选择了第三种方案,创建了spStatRemarks存储过程,在过程中创建了tblStatRemarks表,并将其插入
3、统计后的评教信息。该表以教师ID为主键,以实现各位教师评分记录的单一性。,存储过程:为完成特定的功能而汇集在一起的一组SQL程序语句,经编译后存储在数据库中的SQL程序。,提问:在程序开发中,有时需要编写数百行T-SQL 语句来访问数据库中的数据,这些代码在程序中不仅破坏了程序的可读性,而且为将来应用程序的修改和维护带来很多不便。有没有种方法能封装这些语句,使其作为一个集合出现呢?,存储过程的类型:在 Microsoft SQL Server 2005中有多种可用的存储过程。本节简要介绍每种存储过程。,1、用户定义的存储过程,存储过程是指封装了可重用代码的模块或例程。存储过程可以接受输入参数、
4、向客户端返回表格或标量结果和消息、调用数据定义语言(DDL)和数据操作语言(DML)语句,然后返回输出参数。,2、系统存储过程:,SQL Server 中的许多管理活动都是通过一种特殊的存储过程执行的,这种存储过程被称为系统存储过程。例如,sys.sp_changedbowner 就是一个系统存储过程。,3、扩展存储过程:,SQL Server 支持在 SQL Server 和外部程序之间提供一个接口以实现各种维护活动的系统存储过程。这些扩展存储程序使用 xp_ 前缀。,存储过程的优点:在 SQL Server 中使用存储过程而不使用存储在客户端计算机本地的 Transact-SQL 程序的优
5、点包括:(1)存储过程已在服务器注册。(2)存储过程具有安全特性(例如权限)和所有权链接,以及可以附加到它们的证书。,(3)存储过程可以强制应用程序的安全性。(4)存储过程允许模块化程序设计。(5)存储过程是命名代码,允许延迟绑定。(6)存储过程可以减少网络通信流量。,创建存储过程:,在SQL Server中,可以使用三种方法创建存储过程:(1)使用 T-SQL 语句创建存储过程;(2)使用创建存储过程模板创建存储过程;(3)利用SQL Server 管理平台创建存储过程。,使用 T-SQL 语句创建存储过程:存储过程是使用 CREATE PROCEDURE 语句创建的。它们只能创建在当前的数
6、据库中,但临时的存储过程除外,它们创建在 tempdb 数据库中。,使用 T-SQL 语句创建存储过程的语法:,CREATE PROC|PROCEDURE schema_name.procedure_name;number parameter type_schema_name.data_type VARYING=default OUTPUT,.n WITH,.n FOR REPLICATION AS;.n|;:=ENCRYPTION RECOMPILEEXECUTE_AS_Clause,-创建名为Production.LongLeadProducts 的存储过程,-实现在Production.
7、Product 表中查询制造时间在一天以上的所有产品的名称及产品号的功能CREATE PROCEDURE Production.LongLeadProductsAS SELECTName,ProductNumber FROM Production.Product WHEREDaysToManufacture=1GO,举例9:在 Production 架构中创建名为 LongLeadProducts 的存储过程,该过程返回制造时间在一天以上的所有产品的行集。,使用创建存储过程模板创建存储过程:在SQL Server 管理平台中,选择工具栏中的模板资源资源管理器,出现模板资源管理器窗口,选择存储过
8、程(stored procedure)中的创建存储过程选项,如图所示。在文本框中可以输入创建存储过程的Transact_SQL语句,单击【执行】按钮,即可创建该存储过程。,利用SQL Server 管理平台创建存储过程:在SQL Server管理平台中,展开指定的服务器和数据库,然后展开可编程性,右单击存储过程选项,在弹出的快捷菜单中选择新建存储过程选项,如图所示,出现创建存储过程窗口。,在文本框中输入创建存储过程的 Transact_SQL 语句,单击【执行】按钮,即可创建该存储过程。,举例10:在 adventureworks 数据库中创建一个带有SELECT语句的简单过程(au_info
9、r_all),该存储过程返回所有员工姓名,Email地址,电话。该存储过程不使用任何参数。程序清单如下:USE adventureworksGOCREATE PROCEDURE au_infor_allASSELECT lastname,firstname,emailaddress,phoneFROM person.contactGO,创建存储过程的准则:,限定存储过程所引用的对象名称,每个任务创建一个存储过程,创建,测试存储过程,并对其进行故障诊断,存储过程名称避免使用 sp_ 前缀,对所有存储过程使用相同的连接设置,尽可能减少临时存储过程的使用,执行存储过程:,可以使用 Transact-
10、SQL EXECUTE 语句来运行存储过程。执行存储过程必须具有执行存储过程的权限许可,才可以直接执行存储过程,执行存储过程可使用EXECUTE命令来执行,语法形式如下:EXECUTE return_status=procedure_name;number|procedure_name_var parameter=value|variableOUTPUT|DEFAULT,.n WITH RECOMPILE,针对例9:调用执行存储过程的示例:调用 LongLeadProducts 存储过程。,EXECUTE Production.LongLeadProducts,针对例10:执行存储过程au_i
11、nfor_all。,EXECUTE(EXEC)au_infor_all,查看、修改、重命名和删除存储过程:,使用SQL Server管理平台查看用户创建的存储过程;使用系统存储过程来查看用户创建的存储过程。,使用SQL Server管理平台查看用户创建的存储过程:,在SQL 平台中,展开指定的服务器和数据库,选择并依次展开可编程性存储过程,然后右击要查看的存储过程名称,如图所示,从弹出的快捷菜单中,选择编写存储过程脚本为CREATE到新查询编辑器窗口,则可以看到存储过程的源代码。,使用系统存储过程来查看用户创建的存储过程:,可供使用的系统存储过程及其语法形式如下:sp_help,用于显示存储过
12、程的参数及其数据类型。其语法为:sp_help objname=name,sp_helptext,用于显示存储过程的源代码。其语法为:sp_helptext objname=name sp_depends,用于显示和存储过程相关的数据库对象。其语法为:sp_depends objname=object,sp_stored_procedures,用于返回当前数据库中的存储过程列表。其语法为:sp_stored_proceduressp_name=name,sp_owner=owner,sp_qualifier=qualifier,修改存储过程:存储过程可以根据用户的要求或者基表定义的改变而改变。
13、使用ALTER PROCEDURE 语句可以更改先前通过执行 CREATE PROCEDURE 语句创建的过程,但不会更改权限,也不影响相关的存储过程或触发器。,修改存储过程语法形式如下:ALTER PROCEDURE procedure_name;number parameter data_type VARYING=defaultOUTPUT,.n WITH RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTIONFOR REPLICATION AS sql_statement.n,举例11:创建了一个名为 proc_person 的存储过程,该存储过程包含姓名和
14、Email 地址信息。然后,用 ALTER PROCEDURE 重新定义了该存储过程,使之只包含姓名信息,并使用 ENCRYPTION 关键字使之无法通过查看syscomments表来查看存储过程的内容。程序清单如下:USE adventureworksGO/*创建一个存储过程,该存储过程包含姓名和Email地址信息*/CREATE PROCEDURE proc_personAS SELECT firstname,lastname,emailaddressFROM person.contactORDER BY lastname,firstnameGO,下面对该存储过程进行重新定义。使之只包含姓
15、名信息,并使用 ENCRYPTION 关键字使之无法通过查看 syscomments 表来查看存储过程的内容。程序清单如下:ALTER PROCEDURE proc_personWITH ENCRYPTIONAS SELECT firstname,lastnameFROM person.contactORDER BY lastname,firstnameGO,重命名存储过程:1、修改存储过程的名称可以使用系统存储过程 sp_rename,其语法为:sp_rename 原存储过程名称,新存储过程名称2、通过SQL Server管理平台也可以修改存储过程的名称。在SQL 管理平台中,右击要操作的存
16、储过程名称,从弹出的快捷菜单中选择重命名选项,当存储过程名称变成可输入状态时,就可以直接修改该存储过程的名称。删除存储过程:1、删除存储过程可以使用DROP命令,DROP命令可以将一个或者多个存储过程或者存储过程组从当前数据库中删除,其语法形式如下:drop procedure procedure,n2、利用SQL 管理平台删除存储过程。在SQL Server管理平台中,右击要删除的存储过程,从弹出的快捷菜单中选择删除选项,则会弹出删除对象对话框,在该对话框中,单击“确定”按钮,即可完成删除操作。,创建带有参数的存储过程:,提问:要进入一个网站,经常需要先进行身份验证。我们是否可以通过存储过程
17、和应用程序进行交互,实现所需的身份验证登录模块呢?如果参数作为过程定义的一部分包含在存储过程内,则存储过程更为灵活,因此可创建更通用的应用程序的逻辑。上面的问题也会迎刃而解了。,场景:在上个场景中,由于tblRemarks表做了很大的改动,数据管理员删除现有的存储过程并重新进行设计。新建的存储过程要求根据新的表设置相应的参数。根据应用程序的功能需求进行设计。,设计的逻辑是:根据参数教师ID和评选年份查找 tblRemarks表中是否存在教师评选记录。若有,则将新评分同表中的相应记录均更新至表中;若没有,则将教师的评分记录添加到表中。,存储过程最多支持2100个参数,通过由这些参数组成的列表与调
18、用该过程的程序进行通信。输入参数允许信息传入存储过程,这些值可用作过程中的局部变量。,使用输入参数的准则:若要定义接受输入参数的存储过程,应在 CREATE PROCEDURE 语句中声明一个或多个变量作为参数。使用输入参数时,应考虑以下准则:根据情况相应地为参数提供默认值。在存储过程的开头验证所有传入的参数值,以尽早查出缺少的值和无效值,包括检查参数是否为空。,注意:默认的参数必须是常量或 NULL,在指定的 NULL 作为参数的默认值时,必须使用“NULL”,不能使用“IS NULL”。,输出参数:输出参数允许保留因存储过程的执行而产生的对该参数的任何修改,即使是在存储过程执行完毕之后。在
19、 T-SQL 中使用输出参数,必须在 CREATE PROCEDURE 和 EXECUTE 语句中同时指定 OUTPUT 关键字。,若省略了OUTPUT关键字,存储过程仍会执行,但不会返回修改的值。在大多数客户的编程语言中,参数方向默认为输入,因此必须在客户端指定参数的方向。,举例12:创建一个存储过程,以简化对sc表的数据添加工作,使得在执行该存储过程时,其参数值(Param1,Param2,Param3)作为数据添加到表中。(其数据类型为char(10),char(2),real),程序清单如下:CREATE PROCEDURE dbo.pr1_sc_ins Param1 char(10)
20、,Param2 char(2),Param3 realASBEGINinsert into sc(sno,cno,score)values(Param1,Param2,Param3)END,举例13:在AdventureWorks创建一个带有参数的存储过程GetEmployees,从视图中返回指定的雇员(提供名和姓lastname firstname)及其职务和部门名称,该存储过程接受与传递的参数精确匹配的值。(其数据类型为varchar(30)varchar(10)),程序清单如下:USE AdventureWorks;GOCREATE PROCEDURE GetEmployees last
21、name varchar(30),firstname varchar(10)AS SELECT LastName,FirstName,JobTitle,Department FROM HumanResources.vEmployeeDepartment WHERE FirstName=firstname AND LastName=lastname;GO,举例:使用 EXEC命令传递参数,执行(例12)定义的存储过程 pr1_sc_ins。sc_ins 存储过程可以通过以下方法执行:EXECUTE(EXEC)pr1_sc_ins 3130040101,c1,85当然,在执行过程中变量可以显式命名
22、:EXEC pr1_sc_ins Param1=3130040101,Param2=c1,Param3=85举例:执行(例13)定义的存储过程 GetEmployees。GetEmployees 存储过程可以通过以下方法执行:EXEC GetEmployees Dull,Ann 或者EXEC GetEmployees lastname=Dull,firstname=Ann 或者EXEC GetEmployees firstname=Ann,lastname=Dull,存储过程概述 创建存储过程执行存储过程查看、重命名和删除存储过程创建带有参数的存储过程触发器概述DML触发器的创建和应用DDL触
23、发器的创建和应用 嵌套触发器和递归触发器查看、修改和删除触发器,触发器概述:,触发器是一种特殊的存储过程,它在执行语言事件时自动生效。SQL Server2005 包括两大类触发器:DML 触发器和 DDL 触发器。(1)DML 触发器在数据库中发生数据操作语言(DML)事件时将启用。DML 事件包括在指定表或视图中修改数据的 INSERT 语句、UPDATE 语句或 DELETE 语句。DML 触发器可以查询其他表,还可以包含复杂的 Transact-SQL 语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到错误,则整个事务即自动回滚。(2)DDL 触发器是 SQL
24、Server 2005 的新增功能。当服务器或数据库中发生数据定义语言(DDL)事件时将调用这些触发器。,DML触发器的创建和应用:,当数据库中发生数据操作语言(DML)事件时将调用 DML 触发器。从而确保对数据的处理必须符合由这些SQL语句所定义的规则。DML 触发器的主要优点如下:(1)DML 触发器可通过数据库中的相关表实现级联更改。(2)DML 触发器可以评估数据修改前后表的状态,并根据该差异采取措施。(3)DML 触发器可以防止恶意或错误的 INSERT、UPDATE 以及 DELETE 操作,并强制执行比 CHECK 约束定义的限制更为复杂的其他限制。与 CHECK 约束不同,D
25、ML 触发器可以引用其他表中的列。,提问:很多时候改动一个数据往往会对其它数据产生影响。当用户提交数据时,能否根据数据内容立刻对数据库中的其他数据进行操作?,当创建一个触发器时必须指定如下选项:(1)名称;(2)在其上定义触发器的表;(3)触发器将何时激发;(4)激活触发器的数据修改语句,有效选项为 INSERT、UPDATE 或 DELETE,多个数据修改语句可激活同一个触发器;(5)执行触发操作的编程语句。,DML 触发器使用 deleted 和 inserted 逻辑表。它们在结构上和触发器所在的表的结构相同,SQL Server 会自动创建和管理这些表。可以使用这两个临时的驻留内存的表
26、测试某些数据修改的效果及设置触发器操作的条件。Deleted表用于存储delete,update语句所影响的行的副本。在执行delete或 update 语句时,行从触发器表中删除,并传输到deleted表中。,Inserted 表用于存储 Insert 或 update 语句所影响的行的副本,在一个插入或更新事务处理中,新建的行被同时添加到 Inserted 表和触发器表中。Inserted 表中的行是触发器表中新行的副本。,使用SQL Server管理平台创建触发器的过程如下:在SQL Server管理平台中,展开指定的服务器和数据库项,然后展开表,选择并展开要在其上创建触发器的表,如下图
27、所示,右击触发器选项。,从弹出的快捷菜单中选择新建触发器选项,则会出现触发器创建窗口,如上图所示。,最后,单击执行按钮,即可成功创建触发器。,使用 CREATE TRIGGER 命令创建 DML 触发器的语法形式如下:CREATE TRIGGER schema_name.trigger_name ON table|view WITH ENCRYPTION FOR|AFTER|INSTEAD OF INSERT,UPDATE,DELETEAS sql_statement;.n,使用INSERT触发器:,场景:你为销售部门创建一个数据库,用来存储所有的订货信息。销售经理要实时了解库存情况。因此用户
28、提交订单时,库存数量将会自动减去订单中的数量。你觉得用什么方法比较方便呢?,INSERT触发器通常被用来更新时间标记字段,或者验证被触发器监控的字段中数据满足要求的标准,以确保数据的完整性。举例:建立一个触发器(sc_ins),当向sc表中添加数据时,如果添加的数据与s表中的数据不匹配(没有对应的学号),则将此数据删除。(可设变量bh)程序清单如下:CREATE TRIGGER sc_ins ON sc AFTER INSERT ASBEGINDECLARE bh char(5)Select bh=Inserted.sno from InsertedIf not exists(select s
29、no from s where s.sno=bh)Delete sc where sno=bhEND,当在一个有 UPDATE 触发器的表中修改记录时,表中原来的记录被移动到删除表中,修改过的记录插入到了插入表中,触发器可以参考删除表和插入表以及被修改的表,以确定如何完成数据库操作。举例:创建一个修改触发器(tri_s_upd),该触发器防止用户修改表 s 的入学成绩。程序清单如下:,使用UPDATE触发器:,场景:你为销售部门创建一个数据库,包含产品的信息。为了防止新的销售人员销售库存为零的产品。销售部门希望你通过技术预防出现此类问题。你决定使用触发器来加以预防。一旦销售人员的操作使得库存列
30、中的数值为负值时,将执行RAISERROR()命令进行报警,并将事件写入操作系统的事件日志中。,CREATE TRIGGER tri_s_updON sAFTER updateASIF UPDATE(score)BEGINRAISERROR(不能修改入学成绩,16,10)ROLLBACK TRANSACTIONEND GO,可使用IF UPDATE 语句来定义用来监视特定列的数据更新的触发器,这将允许触发器轻松分离出针对特定列的活动。当触发器检测到特定列发生更新时,它会采取相应的操作,如:引发声明该列不可更新的错误信息,或者基于新更新的列值一系列的语句。,DELETE触发器通常用于两种情况,第
31、一种情况是为了防止那些确实需要删除但会引起数据一致性问题的记录的删除,第二种情况是执行可删除主记录的子记录的级联删除操作。举例:建立一个与s表结构一样的表s1,并建立一个触发器(tr_del)。当删除表s中的记录时,自动将删除掉的记录存放到s1表中。,使用DELETE触发器:,场景:你为销售部门创建一个数据库,专门存储用户订单的信息。你的几个重要客户因为已经有一段时间没有下新订单,因此他们的信息不在最近客户之列。你们那的销售经理发觉在历史的客户记录中,有人错误的删除了这几位重要客户的相关信息,因此她要求你防止类似情况的发生。你决定应该怎么做?,举例:建立触发器(tr_del_s),当删除表 s
32、 中的记录时,自动删除表sc 中对应学号的记录。(可设变量bh)程序清单如下:CREATE TRIGGER tr_del_s ON s AFTER DELETE ASBEGINDECLARE bh char(5)SELECT bh=deleted.sno from deletedDELETE sc where sno=bhEND,程序清单如下:CREATE TRIGGER tr_del ON s/*建立触发器AFTER DELETE/*对表删除操作AS insert s1(SELECT*FROM deleted)/*将删除掉的数据送入表s1中*/GO,使用INSTEAD OF触发器:,INST
33、EAD OF触发器使SQL SERVER 执行触发器中的代码。而不是执行导致触发器激活的操作。INSTEAD OF触发器代替了原始触发器的操作执行。它可以基于一个或多个基表的视图上的定义,它还增加了可对视图执行的更新类型的种类。每个表或视图限制为每个触发操作(INSERT、UPDATE 和DELETE)一个INSTEAD OF触发器。注意:不能在定义了WITH CHECK OPTION 的视图上创建INSTEAD OF触发器。,使用嵌套触发器:,由于任何触发器都可包含影响另一个表的 UPDATE、INSERT 和DELETE语句,当一个触发器启动另一个触发器的操作时,称为嵌套触发器。,可使用嵌
34、套触发器服务器配置选项控制是否嵌套触发器。嵌套在安装时已默认启用,并且设置在服务器中的级别,但是可以使用sp_configure 系统存储过程禁用并重新启用嵌套。,使用递归触发器:,递归触发器所执行的操作将直接或间接引起同一个触发器再次激发的触发器。任何触发器都包含影响同一个表或另一个表的UPDATE、INSERT 或 DELETE 语句。在它启用的情况下,更改表中数据的触发器可能再次激活自身,从而引起递归执行。有两种类型的递归:直接递归:如果一个触发器在同一个表上激发并执行某个操作,而该操作又引起同一个触发器再次激发,则此时为直接递归。,有两种类型的递归(续):间接递归:如果一个触发器激发并
35、执行某个操作,而该操作又引起另一个触发器(同一个表或另一个表中)激发,结果又造成原来的表上的又发生更新,则此时为间接递归,随后又使最初的触发器再次激发。,默认情况下,递归触发器选项在创建数据库时是禁用的。可使用ALTER DATABASE 语句将其启用。可用以下语句启用递归触发器:,ALTER DATABASE AdventureWorks-设置 RECURSIVE_TRIGGERS 数据库选项以启用递归触发器SET RECURSIVE_TRIGGERS ONSp_dboption database,recursive triggers,Ture,在这个交互式多媒体中,你将了解如何通过服务器选
36、项,控制数据库中嵌套触发器的行为。,DDL触发器的创建和应用:,DDL 触发器会为响应多种数据定义语言(DDL)语句而激发。这些语句主要是以 CREATE、ALTER 和 DROP 开头的语句。DDL 触发器可用于管理任务,例如审核和控制数据库操作。DDL 触发器一般用于以下目的:(1)防止对数据库架构进行某些更改;(2)希望数据库中发生某种情况以响应数据库架构中的更改;(3)要记录数据库架构中的更改或事件。,使用 CREATE TRIGGER 命令创建 DDL 触发器的语法形式如下:CREATE TRIGGER trigger_name ON ALL SERVER|DATABASE WITH
37、 ENCRYPTION FOR|AFTER event_type|event_group,.n AS sql_statement;.n,注意:仅在运行触发 DDL 触发器的 DDL 语句后,DDL 触发器才会激发。在响应当前数据库或服务器中处理的 Transact-SQL 事件时,可以激发 DDL 触发器。触发器的作用域取决于事件。举例:使用 DDL 触发器safety来防止数据库中的任一表被修改或删除。程序清单如下:CREATE TRIGGER safety ON DATABASE AFTER DROP_TABLE,ALTER_TABLE AS PRINT You must disable
38、Trigger safety to drop or alter tables!ROLLBACK,查看、修改和删除触发器:,要显示作用于表上的触发器究竟对表有哪些操作,必须查看触发器信息。在SQL Server中,可以用最常用的两种方法查看触发器信息:(1)使用SQL Server管理平台查看触发器信息;(2)使用系统存储过程查看触发器。,使用SQL Server管理平台查看触发器信息:在SQL Server管理平台中,展开服务器和数据库,选择并展开表,然后展开触发器选项,右击需要查看的触发器名称,如图所示,,使用系统存储过程查看触发器:系统存储过程 sp_help、sp_helptext 和
39、sp_depends 分别提供有关触发器的不同信息。其具体用途和语法形式如下。sp_help:用于查看触发器的一般信息,如触发器的名称、属性、类型和创建时间。sp_help 触发器名称sp_helptext:用于查看触发器的正文信息(内容)。sp_helptext 触发器名称sp_depends:用于查看指定触发器所引用的表或者指定的表涉及到的所有触发器。sp_depends 触发器名称sp_depends 表名,从弹出的快捷菜单中,选择编写触发器脚本为CREATE到新查询编辑器窗口,就可以看到触发器的源代码。,通过SQL Server管理平台、存储过程,可以修改触发器的正文和名称。使用SQL
40、 Server管理平台修改触发器正文。在管理平台中,展开指定的表,右击要修改的触发器,从弹出的快捷菜单中选择修改选项,则会出现触发器修改窗口,如图所示。在文本框中修改触发器的SQL语句,单击语法检查按钮,可以检查语法是否正确,单击执行按钮,可以成功修改此触发器。,修改DML触发器的语法形式如下:ALTER TRIGGER schema_name.trigger_name ON table|view WITH ENCRYPTION FOR|AFTER|INSTEAD OF INSERT,UPDATE,DELETE AS sql_statement;.n,修改DML、DDL触发器的T-SQL语句:
41、,修改DDL触发器的语法形式如下:ALTER TRIGGER trigger_name ON ALL SERVER|DATABASE WITH ENCRYPTION FOR|AFTER event_type|event_group,.n AS sql_statement;.n,举例:创建一个触发器(s_reminder),对其加密并用于防止添加或更新S表中数据。程序清单如下:CREATE TRIGGER s_reminder ON SAFTER INSERT,UPDATE AS RAISERROR(不能对该表执行添加、更新操作,16,10)ROLLBACK GO-下面修改触发器.(不能对该表执
42、行添加操作)ALTER TRIGGER s_reminder ON S AFTER INSERT AS RAISERROR(不能对该表执行添加操作,16,10)ROLLBACK GO,禁用或启用触发器:用户可禁用或启用一个指定或表上所有的触发器。当禁用触发器时,它仍在表中存在,但若对表做INSERT等操作,并不执行该触发器动作,直至重新启动。在 ALTER TABLE 语句中,使用 DISABLE TRIGGER 使表上某一触发器无效。但可用 ENABLE TRIGGER 重新启用它。举例:禁用【入库单信息】表上【Trig_更新库存】触发器。程序清单如下:ALTER TABLE 入库单信息DI
43、SABLE TRIGGER Trig_更新库存;-下面重新启用 Trig_更新库存 触发器。程序清单如下:ALTER TABLE 入库单信息ENABLE TRIGGER Trig_更新库存;,由于某种原因,需要从表中删除触发器或者需要使用新的触发器,这就必须首先删除旧的触发器。只有触发器所有者才有权删除触发器。删除已创建的触发器有三种方法:(1)使用系统命令DROP TRIGGER删除指定的触发器。其语法形式如下:DROP TRIGGER trigger,.n(2)删除触发器所在的表。删除表时,SQL Server将会自动删除与该表相关的触发器。(3)在SQL Server管理平台中,展开指定的服务器和数据库,选择并展开指定的表,右击要删除的触发器,从弹出的快捷菜单中选择删除选项,即可删除该触发器。,删除触发器的方法:,数据库存在Production.vExpensiveExpiredProduct视图,该视图来自于Production.ExpiredProduct表。用户无法向该视图中插入数据,你需要找到问题所在并排除故障。在本交互式多媒体中,你可以了解如何使用Transact-SQL语句对视图进行操作,触发器对于视图的影响。,