《[其它]ch83触发器》由会员分享,可在线阅读,更多相关《[其它]ch83触发器(62页珍藏版)》请在金锄头文库上搜索。
1、第第8 8章章 数据库编程(续)数据库编程(续)触发器触发器国脉信息学院20120517本节知识点本节知识点w触发器概述w触发器类型w存储过程执行过程w创建存储过程w修改及删除存储过程w调用存储过程触发器概述触发器概述w场景列名列名数据类型数据类型长度长度学号学号CharChar6 6姓名姓名CharChar8 8性别性别CharChar2 2出生日期出生日期datetimedatetime8 8专业名专业名CharChar2020所在系所在系CharChar4040联系电话联系电话charchar1212列名列名数据类型数据类型长度长度课程号课程号CharChar3 3课程名课程名CharC
2、har2020教师教师CharChar1010开课学期开课学期TinyintTinyint1 1学时学时TinyintTinyint1 1学分学分TinyintTinyint1 1列名列名数据类型数据类型长度长度学号学号CharChar6 6课程号课程号CharChar3 3成绩成绩TinyintTinyint1 1学生情况表学生情况表XSQK课程表KC成绩表XS_KCq银行的取款机系统触发器概述帐户信息表bank交易信息表transInfo张三取钱200问题:有没有自动修改张三的余额张三开户1000元,李四开户1元张三张三李四李四王五王五赵二赵二王三王三宋二宋二刘五刘五插入触发器概述删除赵二
3、退休赵二赵二员工表退休员工表问题:如何实现将赵二的信息自动保存到退休员工表中触发器概述触发器概述w问题分析F存在的问题存在的问题参照完整性级联操作复杂的约束数据修改前后的差别强制的业务规则触发器概述触发器概述w解决问题F解决方案解决方案触发器(Trigger)触发器是一种特殊的存储过程,它在特定语言事件发生时自动执行,通常用于实现强制执行一定的业务规则,以保持数据完整性、检查数据有效性,实现数据管理任务和一些附加的功能。触发器的主要作用是实现由主键和外键所不能保证的复杂的参照完整触发器的主要作用是实现由主键和外键所不能保证的复杂的参照完整性和数据一致性。除此之外,触发器还有以下作用。性和数据一
4、致性。除此之外,触发器还有以下作用。(1)触发器可以对数据库进行级联修改。)触发器可以对数据库进行级联修改。(2)实现比)实现比CHECK约束更为复杂的限制。约束更为复杂的限制。(3)比较数据修改前后的差别。)比较数据修改前后的差别。(4)强制表的修改要合乎业务规则。)强制表的修改要合乎业务规则。触发器的类型触发器的类型w按照触发事件的不同,可以把MicrosoftSQLServer2005系统提供的触发器分成两大类型,即DML触发器和DDL触发器。触发器的类型触发器的类型wDML触发器可以在数据库中数据修改时被执行。wDML事件包括在指定表或视图中修改数据的INSERT语句、UPDATE语句
5、或DELETE语句。wDML触发器可以查询其他表,还可以包含复杂的T-SQL语句。系统将触发器和触发它的语句作为可在触发器内回滚的单个事务对待,如果检测到错误(例如,磁盘空间不足),则整个事务自动回滚。wDDL触发器是MicrosoftSQLServer2005的新增功能。当服务器或数据库中发生数据定义语言(DDL)事件时将调用这些触发器。wDDL触发器与DML触发器的相同之处在于都需要触发事件进行触发,但是,它与DML触发器不同的是,它不会为响应针对表或视图的UPDATE、INSERT或DELETE语句而触发,相反,它会为响应多种数据定义语言(DDL)语句(如:CREATE、ALTER)而触
6、发。规范数据库操作,防止数据库表结构被修改等。触发器的类型触发器的类型DMLDML触发器的创建和应用触发器的创建和应用w在MicrosoftSQLServer2005系统中,按照触发器事件类型的不同,可将DML触发器分成3种类型:INSERT类型、UPDATE类型和DELETE类型w如果该表有INSERT类型的DML触发器,则当向一个表中插入数据时,则该INSERT类型的触发器触发执行;w如果该表有UPDATE类型的DML触发器,则当对该触发器表中的数据执行更新操作时,该触发器就执行;w如果该表有DELETE类型的DML触发器,当对该触发器表中的数据执行删除操作时,该DELETE类型的DML触
7、发器就触发执行。w也可以将这三种触发器组合起来使用。DMLDML触发器的创建和应用触发器的创建和应用w按照触发器和触发事件的操作时间划分,可以把DML触发器分为AFTER触发器和INSTEADOF触发器。w当在INSERT、UPDATE、DELETE语句执行之后才执行DML触发器的操作时,这种触发器的类型就是AFTER触发器。AFTER触发器只能在表上定义。DMLDML触发器的创建和应用触发器的创建和应用w按照触发器和触发事件的操作时间划分,可以把DML触发器分为AFTER触发器和INSTEADOF触发器。w如果希望使用触发器操作代替触发事件操作,可以使用INSTEADOF类型的触发器。也就是
8、说,INSTEADOF触发器可以替代INSERT、UPDATE和DELETE触发事件的操作。INSTEADOF触发器既可以建在表上,也可以建在视图上。通过在视图上建立触发器,可以大大增强通过视图修改表中数据的功能。DMLDML触发器的创建和应用触发器的创建和应用DML触发器的主要优点如下:DML触发器可以防止恶意或错误的插入、修改及删除操作,并强行比较检查约束定义的限制更为复杂的其他限制。与检查约束不同,DML触发器可以引用其他表中的列。例如,触发器可以使用另一个表中的SELECT比较插入或更新的数据,以及执行其他操作,如修改数据或显示用户定义错误信息。DML触发器可以评估数据修改前后表的状态
9、,并根据该差异采取措施。一个表中的多个同类DML触发器(INSERT、UPDATE或DELETE)允许采取多个不同的操作来响应同一个修改语句。DMLDML触发器的创建和应用触发器的创建和应用创建DML触发器应该考虑以下几个问题:CREATETRIGGER必须是批处理中的第一条语句,并且只能应用于一个表。触发器只能在当前的数据库中创建,但是可以引用当前数据库的外部对象。创建触发器的权限默认分配给表的所有者,且不能将该权限转给其他用户。触发器是一种数据库对象,其名称必须遵循标识符的命名规则。虽然不能在临时表或系统表上创建触发器,但是触发器可以引用临时表。DMLDML触发器的创建和应用触发器的创建和
10、应用如果一个表的外键包含对定义的DELETE或UPDATE操作的级联,则不能定义INSTEADOF和INSTEADOFUPDATE触发器虽然TRUNCATETABLE语句类似于没有WHERE子句(用于删除行)的DELETE语句,但它并不会引发DELETE触发器,因为TRUNCATETABLE语句没有记录。如果指定了触发器架构名称来限定触发器,则将以相同的方式限定表名称。在触发器内可以指定任意的SET语句。选择的SET选项在触发器执行期间保持有效,然后恢复为原来的设置。在DML触发器中不允许使用下列Transact-SQL语句:ALTERDATABASE、CREATEDATABASE、DROPD
11、ATABASE、RECONFIGURE、LOADLOG、LOADDATABASE、RESTORELOG、RESTOREDATABASEDMLDML触发器的创建和应用触发器的创建和应用1.DML触发器的创建使用SQLServer管理控制台创建DML触发器在SQLServer管理控制台中,展开指定的服务器和数据库,单击要创建触发器的数据表,右击其中的“触发器”文件夹。从弹出的快捷菜单中选择“新建触发器”选项,会出现新建触发器模板窗口。使用使用Transact-SQLTransact-SQL语句创建语句创建DMLDML触发器触发器CREATETRIGGER触发器名ON表|视图WITHENCRYPTI
12、ONFOR|AFTER|INSTEADOFINSERT,UPDATE,DELETENOTFORREPLICATIONASIFUPDATE(列名)AND|ORUPDATE(列名)nSQL语句(1)FOR|AFTER。FOR与AFTER同义,指定触发器只有在触发器SQL语句中指定的所有操作都已成功后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器,即为后触发。只能在表上定义(2)INSTEADOF。指定执行触发器而不执行造成触发的SQL语句,从而替代造成触发的语句。在表或视图上,每个INSERT、UPDATE或DELETE语句只能定义一个INSTEADOF触发器,即替代触发。
13、(3)INSERT,UPDATE,DELETE是指定在表上执行哪些数据修改语句时将激活触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用任意顺序组合的这些关键字。当进行触发条件的操作时(INSERT、UPDATE或DELETE),将执行SQL语句中指定的触发器操作。使用使用Transact-SQLTransact-SQL语句创建语句创建DMLDML触发器触发器(4)NOTFORREPLICATION。表示当复制进程更改触发器所涉及的表时,不要执行该触发器。(5)IFUPDATE(列名)。测试在指定的列上进行的INSERT或UPDATE操作,不能用于DELETE操作,可以指定多列。因为
14、已经在ON子句中指定了表名,所以在IFUPDATE子句中的列名前不要包含表名。若要测试在多个列上进行的INSERT或UPDATE操作,要分别单独地指定UPDATE(列名)子句。在INSERT操作中IFUPDATE将返回TRUE值,因为这些列插入了显式值或隐性(NULL)值。使用使用Transact-SQLTransact-SQL语句创建语句创建DMLDML触发器触发器(6)注意:在使用WITHENCRYPTION选项时需要注意两点:一是原始触发器的文件丢失,将不能从syscomments表中重新保存加密文本;二是文本加密后,在数据库升级为新版本时不能修改,也不能重新存入新版本中。也就是说,如果
15、触发器文本有可能需要修改,就不要随便将其加密。使用使用Transact-SQLTransact-SQL语句创建语句创建DMLDML触发器触发器wDML触发器使用deleted和inserted逻辑表。它们在结构上和触发器所在的表的结构相同,SQLServer会自动创建和管理这些表。可以使用这两个临时的驻留内存的表测试某些数据修改的效果及设置触发器操作的条件。wDeleted表用于存储delete,update语句所影响的行的副本。在执行delete或update语句时,行从触发器表中删除,并传输到deleted表中。wInserted表用于存储Insert或update语句所影响的行的副本,在
16、一个插入或更新事务处理中,新建的行被同时添加到Inserted表和触发器表中。Inserted表中的行是触发器表中新行的副本。DMLDML触发器的创建和应用触发器的创建和应用注意Deleted与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别是:表中记录的操作虚拟表Inserted虚拟表Deleted新增时存放新增的记录不存储记录修改时存放用来更新的新记录存放更新前的记录删除时不存储记录存放被删除的记录DMLDML触发器的创建和应用触发器的创建和应用DMLDML触发器的应用触发器的应用1、使用INSERT触发
17、器INSERT触发器常被用来更新时间标记字段,或者验证被触发器监控的字段中数据满足要求的标准,以确保数据的完整性。当向数据库中插入数据时,INSERT触发器将被触发执行。INSERT触发器被触发时,新的记录增加到触发器的对应表中,并且同时也添加到inserted表中。INSERT触发器transInfocardIDtransType transMoney1001 00021001 0002存入 300存入 500insertedcardIDtransType transMoney1001 0001 支取200transInfocardIDtransType transMoney1001 000
18、21001 0002存入 300300存入 5005001001 0001支取200插入记录行触发insert触发器。向inserted表中插入新行的副本触发器检查inserted表中插入的新行数据,确定是否需要回滚或执行其他操作qINSERT触发器的工作原理:INSERT触发器示例问题:问题:解决上述的银行取款问题:当向交易信息表(transInfo)中插入一条交易信息时,我们应自动更新对应帐户的余额。分析:分析:l在交易信息表上创建INSERT触发器l从inserted临时表中获取插入的数据行l根据交易类型(transType)字段的值是存入/支取,l增加/减少对应帐户的余额。-关键代码-
19、CREATETRIGGERtrig_transInfoONtransInfoFORINSERTASDECLAREtypechar(4),outMoneyfloatDECLAREmyCardIDvarchar(10SELECTtype=transType,outMoney=transMoney,myCardID=cardIDFROMinsertedIF(type=支取)UPDATEcardinfoSETcurrentMoney=currentMoney-outMoneyWHEREcardID=myCardIDELSEUPDATEcardinfoSETcurrentMoney=currentMon
20、ey+outMoneyWHEREcardID=myCardIDGOINSERT触发器示例从inserted表中获取交易类型、教员金额等根据交易类型,减少或增加对应卡号的余额-测试代码-insertintotransinfovalues(1000000001,支取,200)insertintotransinfovalues(1000000002,存入,800)select*fromcardinfoINSERT触发器示例2、使用DELETE触发器DELETE触发器通常用于两种情况:第一种情况是为了防止那些确实需要删除但会引起数据一致性问题的记录的删除。例如在学生表中删除记录时,同时要删除和某个学生
21、相关的其他信息表中的信息。通常见于用作其他表的外部键的记录;第二种情况是执行可删除主记录的级联删除操作。DMLDML触发器的应用触发器的应用transInfocardIDtransType transMoney1001 00021001 00021001 00021001 0002存入 300存入 5001001 0001支取200DELETE触发器transInfocardIDtransType transMoney1001 00021001 0002存入300存入500deletedcardIDtransType transMoney1001 0001支取 200删除记录行触发delete
22、触发器向deleted表中插入被删除的副本触发器检查deleted表中被删除的数据,决定是否需要回滚或执行其他操作qDELETE触发器的工作原理:问题:问题:当删除交易信息表时,要求自动备份被删除的数据到表backupTable中。分析:分析:l在交易信息表上创建DELETE触发器l被删除的数据可以从deleted表中获取DELETE触发器示例-关键代码-CREATETRIGGERtrig_delete_transInfoONtransInfoFORDELETEASprint开始备份数据,请稍后.IFNOTEXISTS(SELECT*FROMsysobjectsWHEREname=backup
23、Table)SELECT*INTObackupTableFROMdeletedELSEINSERTINTObackupTableSELECT*FROMdeletedprint备份数据成功,备份表中的数据为:SELECT*FROMbackupTableGO从deleted表中获取被删除的交易记录DELETE触发器示例3、使用UPDATE触发器UPDATE触发器和INSERT触发器的工作过程基本一致,修改一条记录等于插入了一条新的记录并且删除一条旧的记录,同时使用inserted表和deleted表。理解触发器里面的两个临时的表:Deleted,Inserted。注意Deleted与Inserte
24、d分别表示触发事件的表“旧的一条记录”和“新的一条记录”。一个Update的过程可以看作为:复制旧的记录到Deleted表,生成新的记录到Inserted表,然后删除Student记录并写入新纪录。Deleted(更新前的数据)customerNamecardID currentMoney李四1000 0002 1bankcustomerNamecardID currentMoney张三10010001 1000 李四李四10000002 1UPDATE触发器删除记录行向deleted表中插入被删除的副本检查deleted和inserted表中的数据,确定是否需要回滚或执行其他操作qUPDAT
25、E触发器的工作原理:李四1000000220001向inserted表中插入被添加的副本Inserted(更新后的数据)customerNamecardID currentMoney李四1000 0002 20001插入记录行问题:问题:跟踪用户的交易,交易金额超过20000元,则取消交易,并给出错误提示。分析:分析:l在bank表上创建UPDATE触发器l修改前的数据可以从deleted表中获取l修改后的数据可以从inserted表中获取UPDATE触发器示例-关键代码-CREATETRIGGERtrig_update_bankONbankFORUPDATEASDECLAREbeforeMo
26、neyMONEY,afterMoneyMONEYSELECTbeforeMoney=currentMoneyFROMdeletedSELECTafterMoney=currentMoneyFROMinsertedIFABS(afterMoney-beforeMoney)20000BEGINprint交易金额:+convert(varchar(8),ABS(afterMoney-beforeMoney)RAISERROR(每笔交易不能超过2万元,交易失败,16,1)ROLLBACKTRANSACTIONENDGO从deleted表中获取交易前的余额,从inserted表中获取交易后的余额UPDA
27、TE触发器交易金额是否2万回滚事务,撤销交易4、列级UPDATE触发器qUPDATE触发器除了跟踪数据的变化(修改)外,还可以检查是否修改了某列的数据q使用UPDATE(列)函数检测是否修改了某列问题:问题:交易日期一般由系统自动产生,默认为当前日期。为了安全起见,一般禁止修改,以防舞弊。 分析:分析:UPDATE(列名)函数可以检测是否修改了某列-关键代码-CREATETRIGGERtrig_update_transInfoONtransInfoFORUPDATEASIFUPDATE(transDate)BEGINprint交易失败.RAISERROR(安全警告:交易日期不能修改,由系统自动
28、产生,16,1)ROLLBACKTRANSACTIONENDGO检查是否修改了交易日期列transDate回滚事务,撤销交易列级UPDATE触发器列级列级 UPDATEUPDATE触发器触发器【例】创建一个修改触发器,该触发器防止用户修改xs表中的学号。createtriggerupdate_xhonxsforupdateasifupdate(学号)beginprint不能修改学号rollbackendgo分析:分析:create trigger notallowdeleteon cjinstead of delete as print not allowed deletego5 5、使用、使
29、用INSTEAD OFINSTEAD OF触发器触发器w如果视图的数据来自于多个基表,则必须使用INSTAEDOF触发器支持引用表中的数据的插入、更新和删除操作。w如果视图的列为以下几种情况之一:基表中的计算列基表中的标识列具有timestamp数据类型的基表列w该视图的INSERT语句必须为这些列指定值,INSTEADOF触发器在构成将值插入基表的INSERT语句时,会忽略指定的值。w下面通过一个例子说明。5 5、使用、使用INSTEAD OFINSTEAD OF触发器触发器(1)简单的INSTEADOF触发器【例】创建一个INSTEADOF触发器,要求实现以下功能:在kc表上创建一个删除类
30、型的触发器TR_NotAllowDelete,当在kc表中删除记录时,触发该触发器,显示“不允许删除表中数据!”的提示信息。Ifexists(selectnamefromsysobjectswherename=TR_NotAllowDeleteandtype=tr)droptriggerTR_NotAllowDeleteGocreatetriggerTR_NotAllowDeleteonkcinsteadofdeleteasprintINSTEADOF触发器开始执行print本表中的数据不允许被删除!不能执行删除操作!go5 5、使用、使用INSTEAD OFINSTEAD OF触发器触发器(
31、2)在视图上创建INSTEADOF触发器:在“软件技术专业学生成绩视图”上创建触发器instead_ins,要求向该视图插入数据时,实际只向xs表的“学号”、“姓名”字段插入数据,创建成功后向视图中插入数据体会触发器的作用ifexists(select*fromsysobjectswherename=instead_insandtype=tr)droptriggerinstead_insgocreatetriggerinstead_inson软件技术专业学生成绩视图insteadofinsertasbegininsertintoxs(学号,姓名)select学号,姓名frominsertede
32、ndgoinsertinto软件技术专业学生成绩视图values(0001,王小凡,2004,体育,98)insertinto软件技术专业学生成绩视图values(0002,王凡,null,null,null)insertinto软件技术专业学生成绩视图values(0002,王凡)6、使用嵌套的触发器。如果一个触发器在执行操作时引发了另一个触发器,而这个触发器又接着引发下一个触发器,这些触发器就是嵌套触发器。例如,在执行过程中,如果一个触发器修改某个表,而这个表已经有其他触发器,这时就要使用嵌套触发器。嵌套触发器最深可以嵌套至32层。使用系统存储过程sp_config设置是否使用嵌套触发器E
33、xecsp_configinested_trigger,0|1当设置为1时,表示允许使用嵌套触发器,否则禁止使用。DDLDDL触发器的创建与应用触发器的创建与应用 (1/3)1/3)DDL触发器一般用于执行以下操作:防止对数据库架构进行某些更改。希望数据库中发生某种情况以响应数据库架构中的更改。要记录数据库架构中的更改或事件。仅在运行触发DDL触发器的DDL语句后,DDL触发器才会激发。DDL触发器无法作为INSTEADOF触发器使用。仅在要响应由Transact-SQLDDL语法指定的DDL事件时,DDL触发器才会激发。不支持执行类似DDL操作的系统存储过程。DDLDDL触发器的创建与应用触
34、发器的创建与应用 (2/3)2/3)1.创建DDL触发器使用CREATETRIGGER命令创建DDL触发器的语法形式如下:CREATETRIGGERtrigger_nameONALLSERVER|DATABASEWITH,.nFOR|AFTERevent_type|event_group,.nASsql_statement;.n|EXTERNALNAME;:=ENCRYPTIONEXECUTEASClause:=assembly_name.class_name.method_nameDDLDDL触发器的创建与应用触发器的创建与应用 (3/3)3/3)2.DDL触发器的应用在响应当前数据库或服务
35、器中处理的Transact-SQL事件时,可以激发DDL触发器。触发器的作用域取决于事件。例如,每当数据库中发生CREATETABLE事件时,都会触发为响应CREATETABLE事件创建的DDL触发器。每当服务器中发生CREATELOGIN事件时,都会触发为响应CREATELOGIN事件创建的DDL触发器。【例】使用DDL触发器来防止数据库中的任一表被修改或删除。CREATETRIGGERsafetyONDATABASEFORDROP_TABLE,ALTER_TABLEASPRINTYoumustdisableTriggersafetytodroporaltertables!ROLLBACK查
36、看并修改触发器查看并修改触发器1使用SQLServer管理控制台查看并修改触发器(1)查看并修改触发器定义信息在SQLServer管理控制台中,展开指定的服务器和数据库,选择指定的数据库和表,单击要查看的表,单击其中的“触发器”文件夹,此时会在右侧的“摘要”窗口中看到此表中的所有触发器,右击某个触发器名称,从弹出的快捷菜单中选择“修改”选项,在打开的窗口中可以查看到定义触发器的语句,在窗口中也可以直接修改触发器的定义。查看并修改触发器查看并修改触发器(2)查看与触发器有依赖关系的其他数据库对象w右击某个触发器名称,从弹出的快捷菜单中选择“查看依赖关系”选项,在出现的“对象依赖关系”对话框中可以
37、查看到依赖于此触发器的对象和此触发器依赖的对象。查看并修改触发器查看并修改触发器2使用系统存储过程查看触发器w可以使用系统存储过程sp_help、sp_helptext和sp_depends分别查看触发器的不同信息。它们的具体用途和语法形式如下:sp_help:用于查看触发器的一般信息,如触发器的名称、属性、类型和创建时间。语法格式:sp_help触发器名称sp_helptext:用于查看触发器的正文信息。语法格式:sp_helptext触发器名称查看并修改触发器查看并修改触发器sp_depends:用于查看指定触发器所引用的表语法格式:sp_depends触发器名称【例】使用系统存储过程查看
38、tr_cj_insert触发器的一般信息。usexsglgosp_helptr_cj_insert【例】使用系统存储过程查看tr_cj_insert触发器所引用的表usexsglgosp_dependstr_cj_insert查询出对应数据库中的触发器USExsglgoSELECT*FROMsys.triggers查看并修改触发器查看并修改触发器2.修改触发器可以通过SQLServerManagementStudio、存储过程和T-SQL语句来修改触发器的正文和名称。(1)使用SQLServerManagementStudio修改已创建的触发器的信息。查看并修改触发器查看并修改触发器(2)使用
39、ALTERTRIGGER修改DML触发器的语法形式如下ALTERTRIGGERschema_name.trigger_nameON(table|view)WITH,.n(FOR|AFTER|INSTEADOF)DELETE,INSERT,UPDATENOTFORREPLICATIONASsql_statement;.n|EXTERNALNAME;:=ENCRYPTION:=assembly_name.class_name.method_name删除触发器删除触发器删除已创建的触发器有三种方法:(1)使用系统命令DROPTRIGGER删除指定的触发器。其语法形式如下:DROPTRIGGERtri
40、gger,n(2)删除触发器所在的表。删除表时,SQLServer将会自动删除与该表相关的触发器。(3)在SQLServerManagementStudio中,展开指定的服务器和数据库,找到想要删除的触发器,右击要删除的触发器,从弹出的快捷菜单中选择“删除”选项,课堂练习:课堂练习:准备工作:在xsgl数据库中创建三张表xb(系部代码,系部,系主任)zy(专业代码,专业,系部代码)bj(班级代码,班级,专业代码,系部代码,备注)1、创建一个INSTER触发器:在xsgl数据库中建立一个名为“inster_xibu”的INSTER触发器,存储在zy表中。向zy表中插入记录时,如果插入了“系部”表
41、中没有的代码,则提示“系部代码不存在系部表中,不能插入记录,插入将终止!”,否则提示“插入成功”课堂练习:课堂练习:准备工作:在xsgl数据库中创建三张表xb(系部代码,系部,系主任)zy(专业代码,专业,系部代码)bj(班级代码,班级,专业代码,系部代码,备注)2、创建一个DELETE触发器:在xsgl数据库中建立一个名为“delete_zy”的DELETE触发器,存储在zy表中。删除zy表中记录时,如果bj表引用了此记录的专业代码,则提示用户“不能删除记录”,否则提示“记录已删除”课堂练习:课堂练习:准备工作:在xsgl数据库中创建三张表xb(系部代码,系部,系主任)zy(专业代码,专业,系部代码)bj(班级代码,班级,专业代码,系部代码,备注)3、创建一个UPDATE触发器:在xsgl数据库中建立一个名为“update_zy”的UPDATE触发器,存储在zy表中。更新zy表中的“专业”字段时,提示用户“不能修改专业”