资源描述
Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,#,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,SQL Server 2000编程触发器,一、,了,了解,触,触发器,-创建帐,户,户信息,表,表bank和交易,表,表transInfo,CREATETABLEbank,-,-帐户信,息,息表,(,customerNameCHAR(8)NOTNULL,-,-,-,-顾客姓,名,名,cardIDCHAR,(,(10,),)NOTNULL,-,-卡号,currentMoneyMONEYNOTNULL,-,-当前余,额,额,),CREATETABLEtransInfo,-,-交易信,息,息表,(,cardIDCHAR,(,(10,),)NOTNULL,-,-卡号,transTypeCHAR,(,(4)NOT NULL,-,-交易类,型,型(存,入,入/支取),transMoneyMONEYNOTNULL,-,-交易金,额,额,transDateDATETIME NOTNULL,-,-交易日,期,期,),一个典,型,型的应,用,用:银,行,行的取,款,款系统,/*-,-,-添加约,束,束:帐,户,户余额,不,不能少,于,于元,,交,交易日,期,期默认,为,为当天,日,日期-,-,-*/,ALTERTABLEbank,ADDCONSTRAINTCK_currentMoneyCHECK,(,(currentMoney=1),ALTERTABLEtransInfo,ADDCONSTRAINTDF_transDateDEFAULT(getDate(,),)FORtransDate,GO,/*-,-,-插入测,试,试数据,:,:张三,开,开户,,开,开户金,额,额为;,李,李四开,户,户,开,户,户金额-,*,*/,INSERTINTObank(customerName,cardID,currentMoney)VALUES,(,(张三,1001 0001,1000,),),INSERTINTObank(customerName,cardID,currentMoney)VALUES,(,(李四,1001 0002,1,),),/*-,-,-插入测,试,试数据,:,:张三,取,取钱-,*,*/,INSERTINTOtransInfo,(,(cardID,transType,transMoney)VALUES,(,(10010001,支取,200),-查看结,果,果,SELECT,*,*FROM bank,SELECT,*,*FROM transInfo,一个典,型,型的应,用,用:银,行,行的取,款,款系统,帐户信,息,息表bank,交易信,息,息表transInfo,张三取,钱,钱200,问题:,没有自动修,改,改张三的,余,余额,最优的,解,解决方,案,案就是,采,采用触发器,:,:,它是一,种,种特殊,的,的存储,过,过程,也具备,事,事务的,功,功能,它能在多表之间执,行,行特殊,的,的业务,规,规则,张三开,户,户1000元,李四开,户,户1元,张三,李四,王五,赵二,王三,宋二,刘五,插入,1.什,么,么是触,发,发器,删除,触发器,触,触发,赵二退,休,休,赵二,员工表,退休员,工,工表,触发器,是,是在对,表,表进行,插,插入、,更,更新或,删,删除操,作,作时自动执,行,行的存,储,储过程,触发器,通,通常用,于,于强制,业,业务规,则,则,触发器,是,是一种高级约,束,束,可以,定,定义比,用,用CHECK,约,约束,更,更为复,杂,杂的约,束,束,可执行,复,复杂的SQL,语,语句(if/while/case),可引用,其,其它表,中,中的列,什么是,触,触发器,2.触,发,发器主,要,要提供,的,的功能,在数据,库,库中的,相,相关表,上,上实现,级,级联更,改,改,事务功,能,能,撤,销,销或回,滚,滚违反,引,引用完,整,整性的,操,操作,,防,防止非,法,法修改,操,操作,执行比CHECK,约,约束,更,更复杂,的,的约束,操,操作,比较数,据,据修改,前,前后的,状,状态,大部分,触,触发器,提,提供了,引,引用被,修,修改数,据,据的能,力,力,这,样,样就允,许,许用户,在,在触发,器,器中引,用,用正被,修,修改语,句,句所影,响,响的行,在一张,表,表的同,一,一类型,操,操作(update,insert,delete),上,上设置,多,多个触,发,发器,,从,从而可,以,以对同,样,样的修,改,改语句,执,执行不,同,同的多,种,种操作,。,。,3.使,用,用触发,器,器的说,明,明,和特定,表,表关联,,,,自动,调,调用。,当试图,在,在某个,表,表插入,、,、更新,或,或删除,数,数据,,而,而在那,个,个表上,定,定义了,针,针对所,做,做动作,的,的触发,器,器,那,么,么触发,器,器会自,动,动执行,。,。,只有表,的,的拥有,者,者才可,以,以在表,上,上创建,或,或删除,触,触发器,,,,这种,权,权限不,许,许转授,。,。,不能再,在,在视图,或,或临时,表,表上创,建,建触发,器,器,但,可,可以在,触,触发器,中,中引用,视,视图或,临,临时表,。,。,是一个,事,事务的,部,部分。,如,如果触,发,发器执,行,行不成,功,功,则,整,整个修,改,改事务,回,回滚。,不像普,通,通的存,储,储过程,,,,触发,器,器不能,被,被直接,调,调用,,也,也不传,递,递或接,受,受参数,当使用,约,约束、,规,规则、,默,默认值,就,就可以,实,实现预,定,定的数,据,据完整,性,性时,,应,应该优,先,先使用,前,前3种,措,措施。,4.触,发,发器的,类,类型,DELETE,触,触发,器,器,INSERT,触,触发,器,器,UPDATE,触,触发,器,器,触发器,触,触发时,:,:,系统自,动,动在内,存,存中创,建,建deleted表,或,或inserted,表,表,只读,,不,不允许,修,修改;,触,触发器,执,执行完,成,成后,,自,自动删,除,除,inserted,表,表,临时保,存,存了插入或,更,更新后的记录,行,行,可以从inserted表,中,中检查,插,插入的,数,数据是,否,否满足,业,业务需,求,求,如果不,满,满足,,则,则向用,户,户报告,错,错误消,息,息,并,回,回滚操,作,作,deleted 表,临时保,存,存了删除或,更,更新前的记录,行,行,可以从deleted表中,检,检查被,删,删除的,数,数据是,否,否满足,业,业务需,求,求,如果不,满,满足,,则,则向用,户,户报告,错,错误消,息,息,并,回,回滚操,作,作,5.inserted 和deleted,inserted,和,和deleted,表,表,修改操作,inserted表,deleted表,增加(INSERT)记录,存放新增的记录,-,删除(DELETE)记录,-,存放被删除的记录,修改(UPDATE)记录,存放更新后的记录,存放更新前的记录,inserted表,和,和deleted表,存,存放的,信,信息,创建触,发,发器的,语,语法:,二、创,建,建触发,器,器,CREATETRIGGERtrigger_name,ONtable_name,WITHENCRYPTION,FOR,/,/AFTER,/,/INSTEADOF,DELETE,INSERT,UPDATE,AS,T-SQL语,句,句,GO,WITH ENCRYPTION,表,表示加,密,密触发,器,器定义,的,的SQL文本,DELETE,INSERT,UPDATE指定,触,触发器,的,的类型,创建触,发,发器,FOR,和,和AFTER,是,是完全,相,相等的,,,,创建,相,相同类,型,型的触,发,发器,,在,在INSERT、UPDATE,或,或 DELETE,语,语句执,行,行后触,发,发,INSTEAD OF 触,发,发器取,消,消触发,动,动作,,执,执行替,代,代操作,创建触,发,发器后,,,,其信,息,息插入sysobjects,和,和 syscomments 系,统,统表中,SQLServer 不,允,允许在,触,触发器,中,中使用,下,下列语,句,句:,ALTERDATABASE、CREATEDATABASE,、,、DISKINIT、DISKRESIZE、DROPDATABASE,、,、LOADDATABASE、LOAD LOG、RECONFIGURE、RESTORE DATABASE、RESTORELOG,1.INSERT,触,触发器,transInfo,cardID,transType transMoney,1001 0002,1001 0002,存入,300,存入,500,inserted,cardID,transType transMoney,1001 0001,支取,200,transInfo,cardID,transType transMoney,1001 0002,1001 0002,存入,300,存入,500,1001 0001,支取,200,插入记,录,录行,触发insert触,发,发器。,向,向inserted,表,表中插,入,入新行,的,的副本,触发器,检,检查inserted表中,插,插入的,新,新行数,据,据,确,定,定是否,需,需要回,滚,滚或执,行,行其他,操,操作,INSERT触发器,的,的工作,原,原理:,INSERT,触,触发,器,器示例,问题:,解决上,述,述的银,行,行取款,问,问题:,当,当向交,易,易信息,表,表(transInfo),中,中插入,一,一条交,易,易信息,时,时,我,们,们应自,动,动更新,对,对应帐,户,户的余,额,额。,帐户信,息,息表bank,交易信,息,息表transInfo,张三取,钱,钱200,问题:,没有自动修,改,改张三的,余,余额,张三开,户,户1000元,李四开,户,户1元,分析:,在交易,信,信息表,上,上创建INSERT触发器,从inserted临时表,中,中获取,插,插入的,数,数据行,根据交,易,易类型,(,(transType)字段,的,的值是,存,存入/,支,支取,,增加/,减,减少对,应,应帐户,的,的余额,。,。,INSERT,触,触发,器,器示例-,-,-,-,-关键,代,代码-,-,-,-,-,CREATETRIGGERtrig_transInfo,ONtransInfo,FORINSERT,AS,DECLARE type char,(,(4),outMoney MONEY,DECLARE myCardIDchar(10),balanceMONEY,SELECT,type,=,=transType,outMoney=transMoney,,myCardID,=,=cardID FROMinserted,IF,(,(type,=,=支,取,取),UPDATEbankSETcurrentMoney=currentMoney-,outMoneyWHERE cardID=,myCardID,ELSE,UPDATEbankSETcurrentMoney=currentMoney+,outMoneyWHEREcardID,=,=myCardID,.,GO,从inserted,表,表中获,取,取交易,类,类型、,交,交易金,额,额等,根据交,易,易类型,,,,减少,或,或增加,对,对应卡,号,号的余,额,额,INSERT,触,触发,器,器示例,transInfo,cardID,transType transMoney,1001 0002,1001 0002,存入,300,存入,500,1001
展开阅读全文