不错呦!smile@林凯西,确保“准备文件”中的几个文件都有安装,S...您好,看了您这篇帖子觉得很有帮助。但是有个问题想请...我的修改过了怎么还被恶意注册呢 @jjjjiiii 用PJ快9年了,主要是A...PJ3啊,貌似很少有人用PJ了,现在不是WP就是z...@332347365,我当时接入时错误码没有-10...楼主,ChkValue值应为-103是什么意思呢?...大哥 你最近能看到我发的信息,请跟我联系,我有个制...
SQL Server2000 触发器
编辑:dnawo 日期:2009-01-22
触发器是一种特殊的存储过程,在用户试图对指定的表执行指定的数据修改语句时自动执行。创建语法:
引用内容
下边主要说下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获取新增记录。
示例
递归触发器
当在 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 设置无关。

Create TRIGGER trigger_name ON {table | view}
{INSTEAD OF | AFTER} {[Insert] [,] [Update] [,] [Delete]}
AS
sql_statement
{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
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
禁止对表的更新和删除
*/
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 | 引用: 0 | 查看次数: 4561
发表评论
请登录后再发表评论!