《SQLServer存储过程与触发器》由会员分享,可在线阅读,更多相关《SQLServer存储过程与触发器(60页珍藏版)》请在金锄头文库上搜索。
1、SQLServerSQLServer存储过程与触存储过程与触发器发器4.1 SQL Server 存储过程4.1.1存储过程概述存储过程概述存储过程存储过程(StoredProcedure)是一组为是一组为了完成特定功能了完成特定功能T-SQL语句集合语句集合,经编译,经编译后存储在后存储在SQLServer服务器端数据库中。服务器端数据库中。存储过程可以分为两类:存储过程可以分为两类:系统存储过程系统存储过程和和自定义存储过程自定义存储过程。系统存储过程系统存储过程系统存储过程系统存储过程系统存储过程在系统存储过程在SQLServer安装成功后,就安装成功后,就已经存储在系统数据库已经存储在
2、系统数据库Master中,这些存储中,这些存储过程都是以过程都是以sp_为前缀命名的为前缀命名的它们主要是从系统表中获取信息,系统管理员可它们主要是从系统表中获取信息,系统管理员可以通过简单调用系统存储过程而完成复杂的以通过简单调用系统存储过程而完成复杂的SQLServer管理工作。可以通过系统存储过程完成许管理工作。可以通过系统存储过程完成许多管理性或信息的操作。多管理性或信息的操作。系统存储过程在系统存储过程在Master数据库中,在其他数据库数据库中,在其他数据库中可以直接调用,调用时不必在存储过程名前加中可以直接调用,调用时不必在存储过程名前加上数据库名。上数据库名。自定义存储过程自定
3、义存储过程自定义存储过程是由用户创建并能完成自定义存储过程是由用户创建并能完成某一特定功能的存储过程。某一特定功能的存储过程。存储过程的优点存储过程的优点1提高应用程序的通用性和可移植性提高应用程序的通用性和可移植性2可以更有效地管理用户操作数据库的权限可以更有效地管理用户操作数据库的权限3可以提高可以提高T-SQL的速度的速度4减轻服务器的负担减轻服务器的负担5块化程序设计。块化程序设计。6减少操作错误。减少操作错误。7能自动处理复杂的或敏感的事务。能自动处理复杂的或敏感的事务。8可以实现管理任务自动化。可以实现管理任务自动化。4.1.2存储过程的创建与执行存储过程的创建与执行创建前确定创建
4、前确定所有的输入参数以及传给调用者的输出参数。所有的输入参数以及传给调用者的输出参数。被被执执行行的的针针对对数数据据库库的的操操作作语语句句,包包括括调调用用其其它它存储过程的语句。存储过程的语句。返返回回给给调调用用者者的的状状态态值值,以以指指明明调调用用是是成成功功还还是是失败。失败。一个存储过程的最大尺寸为一个存储过程的最大尺寸为128M1.直接创建存储过程直接创建存储过程(1)打开打开MicrosoftSQLServerManager管理器管理器(2)单击数据库前面的单击数据库前面的“+”号,然后单击号,然后单击“Material_Data1”数据库前面的数据库前面的“+”号,号,
5、再单击再单击“可编程性可编程性”前面的前面的“+”号,选择号,选择“存储过程存储过程”,单击鼠标右键,在弹出的,单击鼠标右键,在弹出的快捷菜单中单击快捷菜单中单击“新建存储过程新建存储过程”命令。命令。(3)打开了一个创建存储过程的数据库引打开了一个创建存储过程的数据库引擎查询模板,修改相应参数即可。擎查询模板,修改相应参数即可。直接创建存储过程直接创建存储过程2.代码创建存储过程代码创建存储过程语语法法CREATEPROCEDUREprocedure_name;numberparameterdata_typeVARYING=defaultOUTPUT,.nWITHRECOMPILE|ENCR
6、YPTION|RECOMPILE,ENCRYPTIONASsql_statement.nbegin命令行或命令块命令行或命令块end说说明明procedure_name:用于指定要:用于指定要创创建的存建的存储过储过程的名称。程的名称。number:该该参数是可参数是可选选的整数,它用来的整数,它用来对对同名的存同名的存储过储过程分程分组组,以便用一条,以便用一条DROPPROCEDURE语语句即可将同句即可将同组组的的过过程程一起除去。一起除去。parameter:过过程中的参数。在程中的参数。在CREATEPROCEDURE语语句中可以声明一个或多个参数。句中可以声明一个或多个参数。dat
7、a_type:用于指定参数的数据:用于指定参数的数据类类型。型。Default:用于指定参数的默:用于指定参数的默认值认值。OUTPUT:表明:表明该该参数是一个返回参数。参数是一个返回参数。recompile:表示每次表示每次执执行此存行此存储过储过程程时时都重新都重新编译编译一次一次encryption:所所创创建的存建的存储过储过程的内容会被加密程的内容会被加密3.代码执行存储过程代码执行存储过程利用利用T-SQL执行存储过程的语法格式如下:执行存储过程的语法格式如下:execute过程名过程名参数值,参数值,output(1)没有参数的存储过程创建没有参数的存储过程创建createpr
8、ochyproclasselect*frommanagerwherewage1800执行该存储过程执行该存储过程executehyprocl (2) 有参数存储过程创建有参数存储过程创建createprochyproc2mingzint,maxgzintasselect*frommanagerwherewagebetweenmingzandmaxgz执行实例执行实例假设要显示工资在假设要显示工资在1000到到2000之间的之间的manager信息,具体代码:信息,具体代码:executehyproc21005,18004.1.3 修改存储过程修改存储过程修改存储过程具体格式如下:修改存储过程具
9、体格式如下:alterproc过程名过程名parameter参数类型参数类型parameter参数类型参数类型outputassql_statement.nbegin命令行或命令块命令行或命令块end实例实例修改存贮过程修改存贮过程hyproc2,输出输出manager性别分类人员性别分类人员数与总工资。数与总工资。alterprochyproc2sex1char(2),managercountintoutput,wagetotalrealoutputasbeginSelect*frommanagerselectmanagercount=count(wage)frommanagerwheres
10、ex=sex1selectwagetotal=sum(wage)frommanagerwheresex=sex1end实例实例假设要显示假设要显示manager信息及输出工资的信息及输出工资的最大值与平均值,具体代码如下:最大值与平均值,具体代码如下:Declarex1char(2),x2realexecutehyproc2男男,x1output,x2output4.2 SQL Server 触发器触发器触发器是一种特殊类型的触发器是一种特殊类型的存储过程存储过程,是用户,是用户自定义的复杂的自定义的复杂的完整性控制完整性控制过程。过程。特点:特点:功能强、开销高功能强、开销高维护行级数据的完
11、整性维护行级数据的完整性与与CHECK约束相比,能实现更加复杂的数据完约束相比,能实现更加复杂的数据完整性整性数据完整性数据完整性完整性是指数据的完整性是指数据的正确性正确性相容性(一致性)相容性(一致性)三类基本完整性规则三类基本完整性规则域完整性规则域完整性规则使基本表的使基本表的列列输入有效。输入有效。控制域完整性有效的方法有:限制控制域完整性有效的方法有:限制数据类型、格式、可数据类型、格式、可能的取值范围、修改列值时必须满足的条件能的取值范围、修改列值时必须满足的条件等。等。实体完整性规则实体完整性规则实体完整性规则用来约束现实世界中的实体是可区分的,实体完整性规则用来约束现实世界中
12、的实体是可区分的,即它们具有即它们具有唯一性标识唯一性标识。这一规则在关系模型中的体现。这一规则在关系模型中的体现是基本表所有主属性都不能取空值(是基本表所有主属性都不能取空值(NULL)。)。参照完整性规则参照完整性规则参照完整性规则用来约束具有参照关系的两个表中,参照完整性规则用来约束具有参照关系的两个表中,主主码和外码码和外码的数据要保持一致。的数据要保持一致。触发器的作用触发器的作用完成比约束更复杂的数据约束完成比约束更复杂的数据约束检查所做的检查所做的SQL是否允许是否允许触发器可以检查触发器可以检查SQL所做的操作是否被允许。所做的操作是否被允许。例如:在产品库存表里,如果要删除一
13、条产品记录,在删除记例如:在产品库存表里,如果要删除一条产品记录,在删除记录时,触发器可以检查该产品库存数量是否为零,如果不为零录时,触发器可以检查该产品库存数量是否为零,如果不为零则取消该删除操作。则取消该删除操作。修改其它数据表里的数据修改其它数据表里的数据当一个当一个SQL语句对数据表进行操作的时候,触发器可以根据语句对数据表进行操作的时候,触发器可以根据该该SQL语句的操作情况来对另一个数据表进行操作。语句的操作情况来对另一个数据表进行操作。例如:一个订单取消的时候,那么触发器可以自动修改产品库例如:一个订单取消的时候,那么触发器可以自动修改产品库存表,在订购量的字段上减去被取消订单的
14、订购数量。存表,在订购量的字段上减去被取消订单的订购数量。调用更多的存储过程调用更多的存储过程触发器本身就是一种存储过程,而存储过程是可以嵌套使用触发器本身就是一种存储过程,而存储过程是可以嵌套使用的,所以触发器也可以调用一个或多过存储过程。的,所以触发器也可以调用一个或多过存储过程。触发器的作用触发器的作用发送发送SQLMail在在SQL语句执行完之后,触发器可以判断更改过的记录是否达到语句执行完之后,触发器可以判断更改过的记录是否达到一定条件,如果达到这个条件的话,触发器可以自动调用一定条件,如果达到这个条件的话,触发器可以自动调用SQLMail来发送邮件。来发送邮件。例如:当一个订单交费
15、之后,可以物流人员发送例如:当一个订单交费之后,可以物流人员发送Email,通知他尽快,通知他尽快发货。发货。返回自定义的错误信息返回自定义的错误信息约束是不能返回信息的,而触发器可以。约束是不能返回信息的,而触发器可以。例如插入一条重复记录时,可以返回一个具体的友好的错误信息给前例如插入一条重复记录时,可以返回一个具体的友好的错误信息给前台应用程序。台应用程序。更改原本要操作的更改原本要操作的SQL语句语句触发器可以修改原本要操作的触发器可以修改原本要操作的SQL语句语句例如原本的例如原本的SQL语句是要删除数据表里的记录,但该数据表里的记录语句是要删除数据表里的记录,但该数据表里的记录是最
16、要记录,不允许删除的,那么触发器可以不执行该语句。是最要记录,不允许删除的,那么触发器可以不执行该语句。防止数据表构结更改或数据表被删除防止数据表构结更改或数据表被删除为了保护已经建好的数据表,触发器可以在接收到为了保护已经建好的数据表,触发器可以在接收到Drop和和Alter开开头的头的SQL语句里,不进行对数据表的操作。语句里,不进行对数据表的操作。触发器的种类触发器的种类在在SQLServer2005中,触发器可以分为两大类:中,触发器可以分为两大类:DML触发器和触发器和DDL触发器触发器DML触发器:触发器:DML触发器是当数据库服务器中发生数据操作语言(触发器是当数据库服务器中发生
17、数据操作语言(DataManipulationLanguage)事件时执行的存储过程。)事件时执行的存储过程。DML触发器又分为两类:触发器又分为两类:After触发器和触发器和InsteadOf触发器触发器DDL触发器:触发器:DDL触发器是在响应数据定义语言(触发器是在响应数据定义语言(DataDefinitionLanguage)事件时执行的存储过程。)事件时执行的存储过程。DDL触发器一般用于触发器一般用于执行数据库中管理任务。如审核和规范数据库操作、防止数执行数据库中管理任务。如审核和规范数据库操作、防止数据库表结构被修改等。据库表结构被修改等。SQLSERVER2005新增添功能新
18、增添功能After触发器和触发器和Instead Of触发器触发器After触发器是在记录更变完之后才被激活执触发器是在记录更变完之后才被激活执行的。行的。以删除记录为例:以删除记录为例:SQLServer先将要删除的记录先将要删除的记录存放在删除表里,然后把数据表里的记录删除。存放在删除表里,然后把数据表里的记录删除。再激活再激活After触发器,执行触发器,执行After触发器里的触发器里的SQL语句。语句。执行完毕之后,执行完毕之后,删除内存中的删除表,退出整个删除内存中的删除表,退出整个操作。操作。InsteadOf触发器是在这些操作进行之前就触发器是在这些操作进行之前就激活了,并且不
19、再去执行原来的激活了,并且不再去执行原来的SQL操作,操作,而去运行触发器本身的而去运行触发器本身的SQL语句。语句。触发器的工作原理触发器的工作原理在在SQLServer2005里,为每个里,为每个DML触发器都定义触发器都定义了两个特殊的表,一个是插入表,一个是删除表。了两个特殊的表,一个是插入表,一个是删除表。这两个表是建在数据库服务器的内存中的,是由系统管理的这两个表是建在数据库服务器的内存中的,是由系统管理的逻辑表,而不是真正存储在数据库中的物理表。逻辑表,而不是真正存储在数据库中的物理表。对于这两个表,用户只有读取的权限,没有修改的权限。对于这两个表,用户只有读取的权限,没有修改的
20、权限。这两个表的结构与触发器所在数据表的结构是完全一致的,这两个表的结构与触发器所在数据表的结构是完全一致的,当触发器的工作完成之后,这两个表也将会从内存中删除。当触发器的工作完成之后,这两个表也将会从内存中删除。插入表里存放的是更新前的记录插入表里存放的是更新前的记录对于插入记录操作来说,插入表里存放的是要插入的数据对于插入记录操作来说,插入表里存放的是要插入的数据对于更新记录操作来说,插入表里存放的是要更新的记录。对于更新记录操作来说,插入表里存放的是要更新的记录。删除表里存放的是更新后的记录删除表里存放的是更新后的记录对于更新记录操作来说,删除表里存放的是更新前的记录对于更新记录操作来说
21、,删除表里存放的是更新前的记录(更新完后即被删除);(更新完后即被删除);对于删除记录操作来说,删除表里存入的是被删除的旧记录。对于删除记录操作来说,删除表里存入的是被删除的旧记录。触发器的工作原理触发器的工作原理激活触发器激活触发器的动作的动作Inserted表表Deleted表表Insert存放要插入存放要插入的记录的记录Update存放要更新存放要更新的记录的记录存放更新前的旧存放更新前的旧记录记录Delete存放要删除的旧存放要删除的旧记录记录其他注意事项其他注意事项After触发器只能用于触发器只能用于数据表数据表中,中,InsteadOf触发器触发器可以用于可以用于数据表和视图数据
22、表和视图上,但两种触发器都不可以建上,但两种触发器都不可以建立在立在临时表临时表上。上。一个数据表可以有多个触发器,但是一个触发器只能一个数据表可以有多个触发器,但是一个触发器只能对应一个表。对应一个表。在同一个数据表中,对每个操作(如在同一个数据表中,对每个操作(如Insert、Update、Delete)而言可以建立)而言可以建立许多个许多个After触发器触发器,但但InsteadOf触发器针对每个操作只有建立触发器针对每个操作只有建立一个一个。如果针对某个操作即设置了如果针对某个操作即设置了After触发器又设置了触发器又设置了InsteadOf触发器,那么触发器,那么Insteado
23、f触发器一定会激触发器一定会激活,而活,而After触发器就不一定会激活了。触发器就不一定会激活了。4.2.1触发器定义语法触发器定义语法after触发器:触发器:createtrigger触发器名触发器名on表名表名withencryptionforinsert,update,deleteasbegin命令行或程序块命令行或程序块endInsteadof触发器:触发器:createtrigger触发器名触发器名on表名或视图名表名或视图名insteadofinsert,update,deleteasbegin命令行或程序块命令行或程序块end实例实例创建一个触发器,向创建一个触发器,向man
24、ager中插入一条记中插入一条记录,同时创建一个数据库表并向表中插入两录,同时创建一个数据库表并向表中插入两条记录。条记录。(1)打开打开MicrosoftSQLServerManager管理器。管理器。(2)新建一个数据库引擎查询文档。新建一个数据库引擎查询文档。(3)在数据库引擎查询文档中输入如下代码:在数据库引擎查询文档中输入如下代码:UseMaterial_Data1(4)按键盘上的按键盘上的F5”键,显示如下提示信息:键,显示如下提示信息:命令已成功完成。命令已成功完成。(5)这样就打开要使用的数据库。这样就打开要使用的数据库。实例实例createtriggerhytriggerlo
25、nmanagerforupdateasbegincreatetabletriuser(useridintidentity(1,1)primarykey,usermamevarchar(50),userpwdvarchar(50)insertintotriuser(username,userpwd)values(李明李明,111)insertintotriuser(usermame,userpwd)values(王明王明,222)insertintotriuser(usermame,userpwd)values(刘芳刘芳,333)end实例实例(6)选择创建触发器的代码,按键盘上的选择创建触发器
26、的代码,按键盘上的F5”键,显键,显示如下提示信息:示如下提示信息:命令已成功完成。命令已成功完成。(7)这样就成功创建了触发器。在这里要注意,只是这样就成功创建了触发器。在这里要注意,只是创建了触发器,并没有执行触发器创建了触发器,并没有执行触发器中的代码,即中的代码,即表表triuser还不存在,还不存在,当然该表中也不会有记录。当然该表中也不会有记录。(8)下面来通过对下面来通过对manager表的更新操作调用触发表的更新操作调用触发器器hytriggerl,具体代码如下:,具体代码如下:Updatemanagersetwage=wage+100wheremanagerNo=001(9)
27、选择选择SQL语句,按下键盘上的语句,按下键盘上的F5”键执行该键执行该SQL语句,显示如图语句,显示如图4.5提示信息:提示信息:实例实例 图图4.5执行触发器执行触发器 实例实例(10)提示信息表示影响了四行,即更新了提示信息表示影响了四行,即更新了仓库表中的一条记录,创建仓库表中的一条记录,创建triuser表,并表,并向该表中插入三条记录,向该表中插入三条记录,下面通过下面通过select*fromtriuser来显示触发器来显示触发器产生新表中的数据信息,如图产生新表中的数据信息,如图4.6所示。所示。实例实例图图4.6显示触发器执行后的结果显示触发器执行后的结果 实例实例在订单明细
28、表里,折扣字段不能大于在订单明细表里,折扣字段不能大于0.6,如果插入,如果插入记录时,折扣大于记录时,折扣大于0.6的话,回滚操作。的话,回滚操作。CREATETRIGGER订单明细订单明细_InsertON订单明细订单明细AFTERINSERTASBEGINif(Select折扣折扣frominserted)0.6beginprint折扣不能大于折扣不能大于0.6RollbackTransactionendENDGO实例实例在订单明细表里,折扣字段不能大于在订单明细表里,折扣字段不能大于0.6,如果插入记录时,折扣大于,如果插入记录时,折扣大于0.6的话,回滚操作。的话,回滚操作。CREA
29、TETRIGGER订单明细订单明细_InsertON订单明细订单明细InsteadOfINSERTASBEGINdeclare订单订单IDint,产品产品IDint,单价单价money,数量数量smallint,折扣折扣realset订单订单ID=(select订单订单IDfrominserted)set产品产品ID=(select产品产品IDfrominserted)set单价单价=(select单价单价frominserted)set数量数量=(select数量数量frominserted)set折扣折扣=(select折扣折扣frominserted)if(折扣折扣)0.6print折扣
30、不能大于折扣不能大于0.6elseINSERTinto订单明细订单明细(订单订单ID,产品产品ID,单价单价,数量数量,折折扣扣)实例实例如果更改了学生的学号如果更改了学生的学号,希望他的借书记录仍然与这希望他的借书记录仍然与这个学生相关个学生相关(也就是同时更改借书记录表的学号也就是同时更改借书记录表的学号)CreateTriggertruStudentOnStudent-在在Student表中创建触发表中创建触发器器forUpdate-为什么事件触发为什么事件触发As-事件触发后所要做的事情事件触发后所要做的事情ifUpdate(StudentID)beginUpdateBorrowRec
31、ordSetStudentID=i.StudentIDFromBorrowRecordbr,Deletedd,InsertediWherebr.StudentID=d.StudentIDend实例实例如果该学生已经毕业,希望删除他的学如果该学生已经毕业,希望删除他的学号的同时,也删除它的借书记录。号的同时,也删除它的借书记录。CreatetriggertrdStudentOnStudentforDeleteAsDeleteBorrowRecordFromBorrowRecordbr,DelteddWherebr.StudentID=d.StudentID4.2.2 查看触发器基本信息查看触发器
32、基本信息通过通过sp_help能够查看触发器的基本信能够查看触发器的基本信息息触发器名、所有者、创建者和创建时间。触发器名、所有者、创建者和创建时间。其语法格式如下:其语法格式如下:execsp_help触发器名触发器名如查看触发器如查看触发器hytriggerl信息信息execsp_helphytriggerl实例实例图图4.7查看触发器基本信息查看触发器基本信息 4.2.3 查看触发器代码查看触发器代码通过通过sp_helptext能够查看触发器能够查看触发器SQL的代码信息,但要注意如果在创建触发的代码信息,但要注意如果在创建触发器时使器时使withencrypdon选项,则执行选项,则
33、执行该命令也看不到该命令也看不到SQL代码。其语法格式代码。其语法格式如下:如下:execsp_helptext触发器名。触发器名。若要查看触发器若要查看触发器hytriggerl代码代码execsp_helptexthytriggerl实例实例图图4.8查看触发器查看触发器hytriggerl代码代码4.2.4 修改触发器修改触发器 修改触发器的方法很简单,利用修改触发器的方法很简单,利用T-SQL修改修改触发器的语法格式如下:触发器的语法格式如下:after触发器:触发器:altertrigger触发器名触发器名On表名表名withencryptionforinsert,update,de
34、leteasbegin命令行或程序块命令行或程序块End实例实例修改修改hytriggerl插入行数据插入行数据刘芳刘芳为为张清张清altertriggerhytriggerlonmanagerforupdateasbegincreatetabletriuser(useridintidentity(1,1)primarykey,usermamevarchar(50),userpwdvarchar(50)insertintotriuser(username,userpwd)values(李明李明,111)insertintotriuser(usermame,userpwd)values(王明王明
35、,222)insertintotriuser(usermame,userpwd)values(张清张清,333)end修改修改instead of触发器触发器altertrigger触发器名触发器名on表名或视图表名或视图名名insteadofinsert,update,deleteasbegin命令行或程序块命令行或程序块end修改触发器与创建触发器几乎相同,只修改触发器与创建触发器几乎相同,只是把是把create改为改为alter即可。即可。4.2.5删除触发器删除触发器的方法很简单,利用删除触发器的方法很简单,利用T-SQL删除触发器的语法格式如下:删除触发器的语法格式如下:droptr
36、igger触发器名触发器名4.2.6 DDL触发器触发器DDL触发器是触发器是SQLServer2005新增的一个新增的一个触发器类型,是一种特殊的触发器,它在响触发器类型,是一种特殊的触发器,它在响应数据定义语言(应数据定义语言(DDL)语句时触发。一般)语句时触发。一般用于数据库中执行管理任务。用于数据库中执行管理任务。与与DML触发器一样,触发器一样,DDL触发器也是通过事触发器也是通过事件来激活,并执行其中件来激活,并执行其中的的SQL语句的。但与语句的。但与DML触发器不同,触发器不同,DML触发器是响应触发器是响应Insert、Update或或Delete语句而激活的,语句而激活的
37、,DDL触发器触发器是响应是响应Create、Alter或或Drop开头的语句而开头的语句而激活的。激活的。以下几种情况下可以使用以下几种情况下可以使用DDL触发器:触发器:数据库里的库架构或数据表架构很重要,数据库里的库架构或数据表架构很重要,不允许被修改。不允许被修改。防止数据库或数据表被误操作删除。防止数据库或数据表被误操作删除。在修改某个数据表结构的同时修改另一个在修改某个数据表结构的同时修改另一个数据表的相应的结构。数据表的相应的结构。要记录对数据库结构操作的事件要记录对数据库结构操作的事件语法语法CREATETRIGGER触发器名触发器名ONALLSERVER或或DATABASEF
38、OR或或AFTER激活激活DDL触发器的事件触发器的事件AS要执行的要执行的SQL语句语句实例实例启动启动ManagementStudio,登录到指定的服务器上。,登录到指定的服务器上。在在【对象资源管理器】【对象资源管理器】下选择下选择【数据库】【数据库】,定位到【,定位到【Northwind】数据库上。】数据库上。单击单击【新建查询】【新建查询】按钮,在弹出的按钮,在弹出的【查询编辑器】【查询编辑器】的的编辑区里输入以下代码:编辑区里输入以下代码:CREATETRIGGER禁止对数据表操作禁止对数据表操作ONDATABASEFORDROP_TABLE,ALTER_TABLEASPRINT对
39、不起,您不能对数据表进行操作对不起,您不能对数据表进行操作ROLLBACK;实例实例建立一个建立一个DDL触发器,用于保护当前触发器,用于保护当前SQLServer服务器里所有数据库不能被删除。具服务器里所有数据库不能被删除。具体代码如下:体代码如下:CREATETRIGGER不允许删除数据库不允许删除数据库ONallserverFORDROP_DATABASEASPRINT对不起,您不能删除数据库对不起,您不能删除数据库ROLLBACK;GO在在ManagementStudio如果要修改如果要修改DDL触发器内容,就只能先删除该触发触发器内容,就只能先删除该触发器,再重新建立一个器,再重新建
40、立一个DDL触发器。触发器。触发器的创建例:对例:对S表定义一个删除触发器,使得当删除学生记录时,表定义一个删除触发器,使得当删除学生记录时,将将S_C表中相应的选课记录删除。表中相应的选课记录删除。S(SNO,SNAME)S_C(SNO,CNO,SCORE)触发器的创建例:对例:对S_C表定义一个插入触发器,使得当插入选课记录时,表定义一个插入触发器,使得当插入选课记录时,检查所参照的学生学号和课程号是否存在,如果不存在,则检查所参照的学生学号和课程号是否存在,如果不存在,则撤消所做的插入操作。撤消所做的插入操作。S(SNO,SNAME)C(CNO,CNAME)S_C(SNO,CNO,SCO
41、RE)触发器的创建例:当插入或更新学生成绩时,触发器检查该课程是否为例:当插入或更新学生成绩时,触发器检查该课程是否为考查课,若是,则通过的成绩只能以考查课,若是,则通过的成绩只能以60分计,未通过的只分计,未通过的只能以能以40分计。分计。涉及的表结构:涉及的表结构:C1(Cno,Cname,Ctype) S_C(Sno,Cno,Score) 触发器的创建例:对职工表定义一个插入触发器,使得当插入职工记录时,例:对职工表定义一个插入触发器,使得当插入职工记录时,检查所参照的仓库元组是否存在,如果不存在,则撤消所做检查所参照的仓库元组是否存在,如果不存在,则撤消所做的插入操作。的插入操作。仓库
42、(仓库号,城市,面积)仓库(仓库号,城市,面积)职工(仓库号,职工号,工资)职工(仓库号,职工号,工资)触发器的创建例:对职工表定义一个更新触发器,使得当职工变换所属例:对职工表定义一个更新触发器,使得当职工变换所属仓库时,检查所参照的仓库元组是否存在,如果不存在,仓库时,检查所参照的仓库元组是否存在,如果不存在,则撤消所做的更新操作,如果新的仓库号是则撤消所做的更新操作,如果新的仓库号是WH2则将工则将工资提高资提高10%。仓库(仓库号,城市,面积)仓库(仓库号,城市,面积)职工(仓库号,职工号,工资)职工(仓库号,职工号,工资)触发器的创建CREATETRIGGERTR_UPDATEON职
43、工职工FORUPDATEASDECLAREWHNOCHAR(4)IFUPDATE(仓库号仓库号)BEGINIFNOTEXISTS(SELECT*FROM仓库仓库WHERE仓库号仓库号=(SELECT仓库号仓库号FROMINSERTED)BEGINRAISERROR(非法仓库号非法仓库号!,16,1)ROLLBACKTRANSACTIONENDELSEBEGINSELECTWHNO=仓库号仓库号FROMINSERTEDIFWHNO=WH2UPDATE职工职工SET工资工资=工资工资*1.1WHERE职工号职工号=(SELECT职工号职工号FROMINSERTED)ENDEND触发器的创建CREA
44、TETRIGGERWH_INSON职工职工FORINSERTASIFNOTEXISTS(SELECT*FROM仓库仓库WHERE仓库号仓库号=(SELECT仓库号仓库号FROMINSERTED)BEGINRAISERROR(非法仓库号非法仓库号!,1,1)ROLLBACKTRANSACTIONENDINSERT职工职工VALUES(WH5,E10,1600)IN触发器的创建CREATETRIGGERSCORE_KCONS_CFORINSERT,UPDATEASDECLARESCOREINT,CTYPECHAR(4)SELECTSCORE=SCORE,CTYPE=CTYPEFROMC1,INSERTEDWHEREINSERTED.CNO=C1.CNOIF(CTYPE=考查考查)AND(SCORE60ANDSCORE40)BEGINRAISERROR(该课程为考查课,成绩以该课程为考查课,成绩以60或或40计计!,16,1)ROLLBACKTRANSACTIONEND结束结束