首页 理论教育 T⁃SQL语言创建DML触发器的方法

T⁃SQL语言创建DML触发器的方法

时间:2023-10-21 理论教育 版权反馈
【摘要】:使用TSQL语言中的CREATETRIGGER命令也可以创建DML触发器,其中需要指定以下内容。创DML建触发器的语法形式如下。按照触发器事件类型的不同,可以把SQL Server 2005系统提供的DML触发器分为3种类型,即INSERT类型、DELETE类型和UPDATE类型。触发DELETE触发器后,从受影响的表中删除的行将被放置在deleted表中,使用DE-LETE触发器时,需要考虑以下事项。图8-12 例8-3执行结果以上介绍了用T-SQL语言创建触发器的方法,创建触发器时必须记住以下几点。

T⁃SQL语言创建DML触发器的方法

使用T⁃SQL语言中的CREATETRIGGER命令也可以创建DML触发器,其中需要指定以下内容。

1)触发器的名称。

2)触发器所基于的表和视图。

3)触发器激活的时机。

4)激活触发器的操作语句,有效的选项是INSERT、UPDATE、DELETE。

5)触发器执行的语句。

创DML建触发器的语法形式如下。

978-7-111-33494-1-Chapter08-17.jpg

各参数的说明如下。

●trigger-name:触发器的名字,必须符合MS SQL Server的命名规则,且其名字在当前数据库中必须是唯一的。

●tables|view:在其上执行触发器的表或视图的名字,并且该表或视图必须已经存在。

●FOR、AFTER、INSTEADOF:指定触发触发器的时机。其中AFTER表示只有在执行了指定的操作(INSERT、DELETE、UPDATE)之后触发器才被触发,从而执行触发器中的SQL语句;关键字FOR,表示为AFTER触发器,且该类型触发器仅能在表上创建;INSTEAD OF表示创建INSTEAD OF触发器。

●[DELETE][,][INSERT][,][UPDATE]:指明哪种数据操作将触发触发器。至少要指明一个选项,在触发器的定义中三者的顺序不受限制,且各选项要用逗号隔开。

●AS:是触发器将要执行的动作。

●sql_statement:指定触发器所执行的T-SQL语句。

按照触发器事件类型的不同,可以把SQL Server 2005系统提供的DML触发器分为3种类型,即INSERT类型、DELETE类型和UPDATE类型。下面分别结合例子对这3种基本类型的DML触发器进行详细介绍。

1.INSERT触发器

INSERT触发器就是当对目标表(触发器的基表)执行INSERT操作时,就会触发的触发器。

如【例8-1】,也可以直接用T-SQL语言来实现。

打开查询分析器,输入创建触发器的T-SQL语句,如图8-9所示。

执行T-SQL语句,成功创建触发器tr_insert。添加一条专业记录验证触发器的执行,执行结果如图8-10所示。

978-7-111-33494-1-Chapter08-18.jpg

图8-9 输入创建触发器的T-SQL语句

978-7-111-33494-1-Chapter08-19.jpg

图8-10 例8-1执行结果

2.DELETE触发器

当针对目标数据库运行DELETE语句时,会触发DELETE触发器。DELETE触发器用于约束用户能够从数据库中删除的数据。因为有些数据是不希望用户能轻易删除的。

DELETE触发器通常用于防止那些确实要删除,但是可能会引起数据一致性问题的情况;还可以用于级联删除操作的情况。

触发DELETE触发器后,从受影响的表中删除的行将被放置在deleted表中,使用DE-LETE触发器时,需要考虑以下事项。

●当某行被添加到deleted表中时,它就不再存在于数据库表中,因此deleted表和数据库表没有相同的行。

●创建deleted表时,空间是从内存中分配的,deleted表总是被存储在高速缓存中。

●为DELETE动作定义的触发器并不执行TRUNCATE TABLE语句,原因在于日志不记(www.xing528.com)

录TRUNCATE TABLE语句。

【例8-2】 为“Teaching”数据库的Zy表创建一个在删除记录时,显示“××专业已被删除”的提示信息。

创建触发器的语法如下。

978-7-111-33494-1-Chapter08-20.jpg

执行下面删除操作来验证触发器。

978-7-111-33494-1-Chapter08-21.jpg

执行结果如图8-11所示。

978-7-111-33494-1-Chapter08-22.jpg

图8-11 例8-2执行结果

3.UPDATE触发器

当一个UPDATE语句在目标表上运行的时候,就会触发UPDATE触发器。可将UP-DATE语句看成两步操作:即修改数据前像的DELETE语句和修改数据后像的INSERT语句。当在定义有触发器的表上执行UPDATE语句时,原始行被移入deleted表,更新行被移入in-serted表。

触发器检查deleted和inserted表以及被更新的表,来确定是否更新了多行以及如何执行触发器动作。

可以使用IFUPDATE语句定义一个监视指定列的数据更新的触发器。这样就可以让触发器容易隔离出特定列的活动。当它检测到指定列已经更新时,触发器就会进一步执行适当的动作,例如,发出错误信息指出该列不能更新,或者根据新的更新的列值执行一系列的动作语句。

【例8-3】 为“Teaching”数据库的成绩表(Cj表)创建一个禁止修改成绩“cj”的触发器。

创建cj_update触发器代码如下。

978-7-111-33494-1-Chapter08-23.jpg

执行下面语句修改Cj表中的信息,来验证UPDATE触发器。

978-7-111-33494-1-Chapter08-24.jpg

执行结果如图8-12所示。

978-7-111-33494-1-Chapter08-25.jpg

图8-12 例8-3执行结果

以上介绍了用T-SQL语言创建触发器的方法,创建触发器时必须记住以下几点。

1)触发器和某一指定的表有关,当该表被删除时,任何与该表有关的触发器同样会被删除。比如,当表“Zy”被删除时,触发器“Zy_delete”也同样会被删除。

2)在一个表上的每一个动作只能有一个触发器与之关联。例如,不能在表“Zy”上创建第二个delete触发器,该触发器在有数据被删除时触发。当添加第二个相同delete动作触发的触发器时,第一个触发器会在没有任何警告信息的情况下被删除。

3)在一个表上,最多只能创建三个触发器与之关联,一个INSERT触发器,一个DE-LETE触发器和一个UPDATE触发器。

此外,触发器不允许出现以下语句。

●ALTERDATABASE ●LOADDATABASE

●CREATEDATABASE ●LOADLOG

●SIDKINIT ●RECONFIGURE

●DISKRESIZE ●RESTOREDATABASE

●DROPDATABASE ●RESTORELOG

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈