版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/触发器与存储过程一、实验目的和要求1、理解触发器与存储过程的概念.2、掌握使用T_SQL创建、查看、删除触发器的方法。3、掌握使用T_SQL创建、查看、删除存储过程的方法.4、掌握触发器和存储过程在数据库中的应用。二、实验内容和步骤㈠触发器1、触发器的概念触发器是一段能自动执行的程序,是一种特殊的存储过程,其特殊性在于:不允许使用参数,没有返回值。不允许用户调用,当对表进行插入、删除、修改操作时由系统自动调用并执行(相当于事件方法).为数据表中某个字段设置触发器后,当该字段的数据被INSERT插入、DELETE删除、UPDATE修改更新时,触发器便被激活并自动执行.SQLServer按触发器被激活的时机可分为“后触发"和“替代触发”两种触发方式。(1)后触发若引发触发器执行的语句通过了各种约束检查,成功执行后才激活并执行触发器程序,这种触发方式称为“后触发”。后触发的特点:若引发触发器执行的语句违反了某种约束,该语句不会执行,则后触发方式的触发器也不被激活。后触发方式只能创建在数据表上,不能创建在视图上。一个表可以有多个后触发触发器。(2)替代触发若激活触发器的语句仅仅起到激活触发器的作用,一旦激活触发器后该语句即停止执行,立即转去执行触发器的程序—激活触发器的语句并不被执行,相当于禁止某种操作.这种触发方式称为“替代触发".替代触发的特点:
替代触发可以创建在表上,也可以创建在视图上。
一个表只能有一个替代触发的触发器。2、触发器使用的inserted临时表和deleted临时表不论后触发或替代触发,每个触发器被激活时,系统都自动为它们创建两个临时表:inserted和deleted表.两个表的结构与激活触发器的原数据表结构相同。用INSERT语句插入记录激活触发器时,系统在原表插入记录的同时,也自动把记录插入到inserted临时表。用SELECT语句删除记录激活触发器时,系统在原表删除记录的同时,会把删除的记录添加到deleted临时表。用UPDATE语句修改数据激活触发器时,系统先在原表删除原有记录,删除的记录被添加到deleted临时表,然后再插入新记录,并同时插入到inserted临时表。用户可以用SELECT语句查询这两个临时表,但不允许进行修改。触发器一旦执行完成,这两个表将被自动删除。3、触发器语法格式:CREATETRIGGER触发器名ON{表名|视图名}{for|after|insteadof}[insert,update,delete][WITHencryption]ASSQL语句系列[ROLLBACKTRANSACTION]——事务回滚ON{表名|视图名}:指定激活触发器被操作的表或视图。for与after:指定所创建的触发器为后触发方式,for与after完全相同,for是为了与以前老版本兼容而保留.insteadof:指定所创建的触发器为替代触发方式。insert,update,delete:指定激活该触发器的具体操作,可以指定一项,也可三项同时指定,但必须以逗号隔开。SQL语句系列:即触发器被指定操作激活后要执行的SQL代码,其中可包含获得被操作数据的SELECT语句:后触发方式被操作数据一定在inserted或deleted临时表中。如果被操作的数据是多值的,可用IN判断是否被包含在其中:被操作数据IN(SELECT被操作字段FROM临时表)如果被操作的数据是单值的,可用以下语句获得:SELECT@变量=被操作字段FROM临时表ROLLBACKTRANSACTION:事务回滚语句。对于后触发方式,语句已经执行完毕才执行触发器,如果发现操作不符合规则,可用该语句取消操作.4、触发器实例STEP1、创建《电脑器材销售管理》数据库diannaoxs。代码如下:CREATEDATABASEdiannaoxs—-创建数据库ON(NAME=diannaoxs1,-—创建主数据文件='D:\DNXS\diannaoxs1。mdf',SIZE=1,MAXSIZE=UNLIMITED,-—最大容量不受限制=10%),(NAME=diannaoxs2,--创建辅助数据文件='D:\DNXS\diannaoxs2。ndf’,SIZE=1,MAXSIZE=UNLIMITED,=10%)LOGON/*创建事务日志文件*/(NAME=diannaoxslog,='D:\DNXS\diannaoxslog.LDF',SIZE=500KB,MAXSIZE=5,/*日志文件最大容量5MB*/=500KB)STEP2、在数据库diannaoxs中创建4张表。请留意每张表的字段属性及约束.涉及到数据库完整性的内容,包括默认值、规则、数据表结构的修改等,不明之处可参见前面的实验.usediannaoxsCREATETABLE商品一览表(ﻩ货号char(4)NOTNULLPRIMARYKEY, 货名nvarchar(8)NOTNULLdefault('计算机'), 规格char(4)NOTNULL,ﻩ单位char(2)NOTNULL,ﻩ参考价格numeric(6,2)NULL,ﻩ库存量intNULLdefault(0))CREATETABLE员工表( 员工IDchar(5)NOTNULLCONSTRAINTPK_员工表PRIMARYKEY, 姓名varchar(8)NOTNULLCONSTRAINTIX_员工表UNIQUE, 性别bitNOTNULLCONSTRAINTCK_员工表CHECK(性别=0or性别=1), 出生日期datetimeNOTNULL,ﻩ部门nvarchar(5)NOTNULLCONSTRAINTDF_员工表_部门DEFAULT('销售科'),ﻩ工作时间smalldatetimeNOTNULLﻩ)CREATETABLE销售表( 序号bigintIDENTITY(1,1)NOTNULLPRIMARYKEY, 销售日期smalldatetimeNOTNULL,ﻩ客户名称nvarchar(15)NOTNULL, 货号char(4)NOTNULL,ﻩ货名nvarchar(8)NULL, 单价smallmoneyNOTNULL,ﻩ数量intNOTNULL, 金额moneyNULL,ﻩ销售员varchar(8)NOTNULLﻩ)GOCREATEDEFAULTDefaultDateGOsp_bindefaultDefaultDate,'销售表.销售日期'GOcreaterule大于0as@y>0GOSp_bindrule大于0,’销售表.单价'GOSp_bindrule大于0,'销售表.数量'GOAltertable销售表AddConstraintFKfForeignKey(销售员)References员工表(姓名)CREATETABLE供货商表(供货商IDChar(4)notnullprimarykeycheck(供货商IDlike'[a-zA-Z0-9][a—zA-Z0-9][a-zA-Z0-9][a-zA-Z0-9]’),供货商Nvarchar(15)notnull,厂家地址Nvarchar(20)notnullunique,账户Char(15)notnullunique,联系人Varchar(8))ALTERTABLE供货商表add联系电话char(13)nullALTERTABLE供货商表altercolumn联系电话char(20)notnullALTERTABLE供货商表addconstraint惟一厂家unique(供货商)ALTERTABLE供货商表addconstraint电话约束unique(联系电话),default'’FOR联系电话注释:新增加字段时可以同时设置空值约束、默认值约束。
若不允许为空时则必须给新增加的列指定默认值,否则语句执行错误。添加的字段若不允许为空则必须设置默认值,如果不允许为空又不需要默认值,可在添加字段时先允许为空,再用altercolumn子句修改为不允许为空,则没有默认值.STEP3、数据操纵,往各表中添加记录。INSERT商品一览表(货号,货名,规格,单位,参考价格,库存量)VALUES(’1001’,’计算机',’LC','套’,5800,16)INSERT商品一览表(货号,货名,规格,单位,参考价格,库存量)VALUES('1002’,default,'LX’,'套',5600,8)INSERT商品一览表(货号,货名,规格,单位,参考价格,库存量)VALUES('2001’,’显示器',’15','台’,980,26)INSERT商品一览表(货号,货名,规格,单位,参考价格,库存量)VALUES('2002','显示器','17’,'台’,1250,23)INSERT商品一览表(货号,货名,规格,单位,参考价格,库存量)VALUES(’3001’,'CPU处理器',’P4’,'个’,420,48)INSERT商品一览表(货号,货名,规格,单位,参考价格,库存量)VALUES('4001','内存储条','512M’,'片',225.5,70)INSERT商品一览表(货号,货名,规格,单位,参考价格,库存量)VALUES('4002','内存储条','1G’,'片',335.5,105)INSERT供货商表VALUES('SDLC’,'山东省浪潮集团公司销售公司’,’济南市山大路1008号','1002—305-6','刘绪华',’8’)INSERT供货商表VALUES('BJFZ','北京方正电脑有限公司','北京市海淀区友谊路235号甲','20006786570',’王连胜’,'')INSERT供货商表VALUES(’BJLX’,’北京联想科技股份有限公司','北京市中关村6068-6号','11204567765','赵捷’,’')INSERT供货商表VALUES('SHSC',’上海电脑市场器材销售中心','上海市虹口区8弄科技路225号’,'336-448-669’,’李群','’)INSERT供货商表VALUES('SHKD','上海科大计算机技术服务公司','上海市浦东东方明珠5925号',’2246800012’,’张茂岭',default)INSERT供货商表VALUES(’SDKJ',’山东科技市场计算机销售处','济南市经七纬二路9415号','1245—7845—55',NULL,'')INSERT员工表(员工ID,姓名,性别,出生日期,部门,工作时间)VALUES('11001',’吕川页’,1,'1963-3-7',’办公室',’1985-2—INSERT员工表(员工ID,姓名,性别,出生日期,部门,工作时间)VALUES(’22001’,’郑学敏',0,'1969—11-23','办公室','1994INSERT员工表(员工ID,姓名,性别,出生日期,部门,工作时间)VALUES(’22002',’于丽',0,'1980—12—5’,’INSERT员工表(员工ID,姓名,性别,出生日期,部门,工作时间)VALUES('22003','孙立华’,1,’1979—5-4’,'材料处','INSERT员工表(员工ID,姓名,性别,出生日期,部门,工作时间)VALUES('33001','高宏’,1,'1982-9—29',default,'INSERT员工表(员工ID,姓名,性别,出生日期,部门,工作时间)VALUES(’33002',’章晓晓',0,'1980-11—1','销售科',’2000-5-30INSERT员工表(员工ID,姓名,性别,出生日期,部门,工作时间)VALUES('33003',’陈刚',1,'1979—6—30’INSERT销售表(销售日期,客户名称,货号,数量,单价,销售员)VALUES('2010—3-20','济南新浪计算机公司’,3,5780,'高宏’)INSERT销售表(销售日期,客户名称,货号,数量,单价,销售员)VALUES('2010—6-20','济南新浪计算机公司',5,400,'章晓晓')INSERT销售表(销售日期,客户名称,货号,数量,单价,销售员)VALUES('2010-11—20',’潍坊电脑器材商店','400225,320,'陈刚’)STEP4、触发器应用例题例一:为“员工表"创建一个名为“修改姓名”的后触发器,当修改某个员工姓名时,需要把“销售表”的“销售员”同时进行修改,实现级联修改。首先删除在企业管理中删除“销售表"上的外码约束FKf.在查询分析器中输入以下代码:IFexists(SELECTnameFROMsysobjectsWHEREname='修改姓名'ANDtype=’tr')DROPTRIGGER修改姓名GOCREATETRIGGER修改姓名ON员工表afterupdateASDECLARE@xm1varchar(8),@xm2varchar(8)SELECT@xm1=姓名FROMdeleted--从deleted表得到被删除的原姓名SELECT@xm2=姓名FROMinserted-—从inserted表得到被更新的新姓名UPDATE销售表SET销售员=@xm2WHERE销售员=@xm1GO请同学自己验证此触发器的作用。例二:为“销售表”创建一个名字为“销售检查”的后触发器,当销售某种商品添加一条新记录时,能自动执行以下操作:自动检查销售“数量”不允许大于《商品一览表》中的“库存量”。自动检查“单价”下浮或上调不允许超出《商品一览表》“参考价格”的5%范围.根据“货号”自动从《商品一览表》中获得相应的“货名”数据.自动计算“金额=单价*数量”。对《商品一览表》中“库存量”进行自动更新。实现此例触发器的语句如下:IFexists(SELECTnameFROMsysobjectsWHEREname=’销售检查’ANDtype='tr')DROPTRIGGER销售检查GOCREATETRIGGER销售检查ON销售表afterinsertASDECLARE@xhBigInt,@hhchar(4),@slint,@djSmallmoney,@hmNvarchar(8),@ckjgnumeric(6,2),@kcintSELECT@xh=序号,@hh=货号,@sl=数量,@dj=单价FROMinsertedSELECT@hm=货名,@ckjg=参考价格,@kc=库存量FROM商品一览表WHERE货号=@hhIF@sl<=@kcBEGINIF@dj>=@ckjg*0.95AND@dj<=@ckjg*1.05BEGINUPDATE销售表--条件不能使用货号SET货名=@hm,金额=@sl*@djWHERE序号=@xhUPDATE商品一览表SET库存量=@kc—@slWHERE货号=@hhENDELSEBEGINPRINT'单价超出参考价格’+cast(@ckjgASvarchar(10))+'的%5范围,不能销售'ROLLBACKTRANSACTION-—事务回滚,撤消插入ENDENDELSEBEGINPRINT’销售量大于库存量’+cast(@kcASvarchar(4))+',库存不足不能销售'ROLLBACKTRANSACTIONENDGO下面的INSERT代码在上述触发器的影响下,可生成不同的响应.INSERT销售表(销售日期,客户名称,货号,数量,单价,销售员)VALUES('2010—12-20’,'北京市海淀区友谊路235甲','4001’,80,240,'陈刚—-销售量大于库存量70,库存不足不能销售INSERT销售表(销售日期,客户名称,货号,数量,单价,销售员)VALUES(’2010-12-20’,'北京市海淀区友谊路235甲’,’4001’,10,240,'陈刚’)--单价超出参考价格225。50的%5范围,不能销售INSERT销售表(销售日期,客户名称,货号,数量,单价,销售员)VALUES(’2010-12—20','北京市海淀区友谊路235甲','4001',10,230,'陈刚例三:为“商品一览表”创建一个名为“修改商品”的后触发器,禁止修改“库存量”;当修改某个商品的货名时,需要把“销售表”中相应的数据同时全部修改,实现“商品一览表”和“销售表”的级联修改。IFexists(SELECTnameFROMsysobjectsWHEREname='修改商品’ANDtype='tr')DROPTRIGGER修改商品GOCREATETRIGGER修改商品ON商品一览表afterupdateASDECLARE@hhchar(4),@hmnvarchar(8),@pj1int,@pj2int,@kc1int,@kc2intSELECT@hh=货号,@kc1=库存量FROMdeletedSELECT@hm=货名,@kc2=库存量FROMinsertedIF@kc1<>@kc2BEGINPRINT'库存量不允许修改!'ROLLBACKTRANSACTION--事务回滚,撤消修改ENDELSEUPDATE销售表SET货名=@hmWHERE货号=@hhGO若执行update商品一览表set库存量=100where库存量=105语句会看到系统提示“库存量不允许修改!”若在“商品一览表”中把货号为4001的货名改为“内存条”,可在销售表中看到级联修改效果。例四:设置替代触发器“禁止修改”,不允许对“供货商表"的厂家记录进行修改、删除。IFexists(SELECTnameFROMsysobjectsWHEREname=’禁止修改'ANDtype='tr’)DROPTRIGGER禁止修改GOCREATETRIGGER禁止修改ON供货商表insteadofupdate,delete--修改或删除激活ASPRINT’请原谅,《供货商表》不允许对任何数据修改和删除。'GO该触发器为替代触发,只要对“供货商表"进行任何修改、删除操作,则立即停止并取消该SQL语句对“供货商表”的操作,激活并执行触发器,所以不需要事务回滚语句。5、触发器的查看在控制台根目录下展开数据库→展开数据表节点,选中要创建触发器的表,右键单击鼠标,从快捷菜单中选择“所有任务”→“管理触发器”命令,弹出“触发器属性”对话框。语法格式:Sp_help触发器名Sp_helptext触发器名6、触发器的删除Droptrigger触发器名(二)存储过程1、存储过程的概念存储过程(storedprocedure)是由一系列对数据库进行复杂操作的SQL语句、流程控制语句或函数组成的,并且将代码事先编译好之后、象规则、视图那样作为一个独立的数据库对象进行存储管理。使用存储过程的优点执行速度快:存储过程在创建时已经通过语法检查和编译,调用时则直接执行,程序的运行效率高,其执行速度要比标准SQL语句快得多。含有大量SQL语句的批处理需要重复多次执行时,定义为存储过程可大大提高运行效率。利于模块化程序设计:存储过程创建后,即可以无数次随时任意繁荣调用。可根据不同的功能模式设计不同的存储过程以供调用。便于程序的维护管理:当用户对数据库使用的功能改变时,只需对相应的存储过程进行修改而不用修改应用程序.减少网络通信量:存储过程可包含大量对数据库进行复杂操作的SQL语句,它的存储执行都在SQLServer服务器(数据库)端,网络用户使用时只需发送一个调用语句就可以实现,大大减少了网络上SQL语句的传输。保证系统的安全性:可以在存储过程中设置用户对数据的访问权限,只允许用户调用存储过程而不允许直接对数据进行访问,充分发挥安全机制的作用。2、存储过程的语法格式:CREATEPROCEDURE存储过程名[@形参变量数据类型[=默认值][output]][,…n]ASSQL语句系列其中:@形参变量为指定接收调用参数或返回值的变量,默认状态下只表示单一数值,不能代表表名、列名或其他对象名,形参变量的作用域为该存储过程;
默认值:调用过程语句时不提供参数时,形参变量则取该默认值.默认值只能是常量或NULL。Output:指定形参变量是返回给调用语句的参数,可以是所有数据类型,也可以是游标占位符.注意:在数据库内创建的每个对象(约束、默认值、日志、规则、存储过程等)都会作为该库系统表Sysobjects中的一条记录占一行,该表的结构如下表所示:Sysobjects系统表的结构列名数据类型存储内容说明NameSysname对象名Idint对象标识名Xtype或typeChar(2)对象类型。其中的主要类型:C=CHECK约束P=存储过程D=默认值或DEFAULT约束TR=触发器F=FOREIGNKEY约束V=视图K=PRIMARYKEY或UNIQUE约束R=规则FN=标量函数(自定义函数)U=用户表L=日志S=系统表3、存储过程实例:例一:在diannaoxs数据库中建立一个名为“计算机_pro”的存储过程,用于在“商品一览表”和“销售表”中查询“计算机”产品的基本信息及其销售情况。先判断sysobjects系统表中是否存在名为“计算机_pro"的存储过程,如果存在则删除原有的存储过程,然后再创建。IFexists(SELECTnameFROMsysobjectsWHEREname=’计算机_pro'ANDtype='p’)DROPprocedure计算机_proGOCREATEprocedure计算机_pro--创建存储过程ASSELECT*FROM(select*from商品一览表where货名=’计算机')asCTleftjoin销售表onCT.货号=销售表.货号GOEXECUTE计算机_pro-—调用执行存储过程例二:建立一个名为“商品_pro”的存储过程,带有一个参数接收指定的商品名称,于在“商品一览表"和“
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《家庭伦理剧》课件
- 2014年高考语文试卷(山东)(空白卷)
- 《红岩》课件(中考名著)
- 安全生产安全施工知识培训96
- 无功补偿设备优化配置-洞察分析
- 突触可塑性调控策略研究-洞察分析
- 血液安全与伦理规范-洞察分析
- 网络流量优化策略-洞察分析
- 语境对语法结构的影响-洞察分析
- 网络短视频内容监管-洞察分析
- 2024秋新商务星球版地理7年级上册教学课件 第5章 地球表层的人文环境要素 第3节 世界文化的多样性
- 人教版三年级数学上册 期末测试
- 《跨境电子商务基础》课件-阿里巴巴国际站概述
- 政治-湖南省名校教育联盟2025届高三12月大联考试题和答案
- 2025年上半年四川省成都市大数据中心招聘3人易考易错模拟试题(共500题)试卷后附参考答案-1
- 2024年安徽省高中学业水平合格性考试语文试卷真题(含答案详解)
- 中南大学《创新创业导论》2023-2024学年第一学期期末试卷
- 2024潞安化工集团有限公司第二批煤矿井下一线生产操作岗位招聘2820人笔试核心备考题库及答案解析
- 外研版一年级上册新交际英语(2024)全册教案(单元整体教学设计)
- 房地产中介业务管理制度
- 3.2《遵守规则》-教学设计2024-2025学年统编版道德与法治八年级上册
评论
0/150
提交评论