木子屋 Dnawo's BLOG

SQL Server2000 触发器

👤 dnawo 📅 2009-01-22 👁 4990 👍 0 💬 0 🔄 来源:本站原创
触发器是一种特殊的存储过程,在用户试图对指定的表执行指定的数据修改语句时自动执行。创建语法:

Create TRIGGER trigger_name ON {table | view}
{INSTEAD OF | AFTER} {[Insert] [,] [Update] [,] [Delete]}
AS
sql_statement

下边主要说下INSTEAD OF和AFTER两个参数的区别:

·执行时间:INSTEAD OF在SQL语句执行前触发,并且SQL语句不会再执行;AFTER则是在SQL语句执行后触发。
·适用对象:INSTEAD OF适用于表和视图;AFTER只能用于表。
·数量:Insert、Update和Delete允许有多个AFTER触发器,但只能有一个INSTEAD OF触发器。

再来说说触发器中经常会用到的两张表:inserted和deleted。这两张表在结构上类似于定义触发器的表,其中inserted存放的是Insert的记录或Update后的新记录,deleted存放的是Delete的记录或Update前的旧记录。例如当触发器中SQL语句的执行条件是判断新增记录某个字段值来进行的,那么就得从inserted获取新增记录。

示例

/*
	download表增加一条记录时更新天预统计表count1
*/
Create TRIGGER DownCountTR ON download
AFTER Insert
AS
	IF @@rowcount>0
	BEGIN
		DECLARE @date1 datetime
		--从Inserted表中获取新下载的时间
		Select @date1=convert(nvarchar(10),regtime,120) FROM Inserted
		
		--更新count1表
		IF exists(Select * FROM count1 Where regtime=@date1)
			Update count1 SET downcount=downcount+1 Where regtime=@date1
		ELSE
			Insert INTO count1(downcount,regtime) VALUES(1,@date1)
	END

/*
	禁止对表的更新和删除
*/
Create TRIGGER STOP ON dbo.table1
INSTEAD OF Update, Delete 
AS
RETURN

递归触发器

当在 sp_dboption 中启用 recursive triggers 设置时,SQL Server 还允许触发器的递归调用。递归触发器允许发生两种类型的递归:

·间接递归
·直接递归

使用间接递归时,应用程序更新表 T1,从而激发触发器 TR1,该触发器更新表 T2。在这种情况下,触发器 T2 将激发并更新 T1。

使用直接递归时,应用程序更新表 T1,从而激发触发器 TR1,该触发器更新表 T1。由于表 T1 被更新,触发器 TR1 再次激发,依此类推。

说明 只有启用 sp_dboption 的 recursive triggers 设置,才会发生上述行为。对于为给定事件定义的多个触发器,并没有确定的执行顺序。每个触发器都应是自包含的。禁用 recursive triggers 设置只能禁止直接递归。若要也禁用间接递归,请使用 sp_configure 将 nested triggers 服务器选项设置为 0。

如果任一触发器执行了 ROLLBACK TRANSACTION 语句,则无论嵌套级是多少,都不会进一步执行其它触发器。

嵌套触发器

触发器最多可以嵌套 32 层。如果一个触发器更改了包含另一个触发器的表,则第二个触发器将激活,然后该触发器可以再调用第三个触发器,依此类推。如果链中任意一个触发器引发了无限循环,则会超出嵌套级限制,从而导致取消触发器。若要禁用嵌套触发器,请用 sp_configure 将 nested triggers 选项设置为 0(关闭)。默认配置允许嵌套触发器。如果嵌套触发器是关闭的,则也将禁用递归触发器,与 sp_dboption 的 recursive triggers 设置无关。

评论(0)

暂无评论。

验证码
评论需审核通过后显示
← 上一篇 SqlParameter 构造函数补充 下一篇 → HttpContext.Current.Request.MapP…