加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

关于SQLServer2000中触发器的使用――多行数据提交

发布时间:2020-12-12 15:29:47 所属栏目:MsSql教程 来源:网络整理
导读:关于触发器的使用,有很多争议。 触发器的好处不言而喻是增强了数据的校验能力,能够有效地实现复杂的业务逻辑。在一定程度上走的比约束和check走的更远。 关于触发器的坏处,最典型的就是触发器的使用会导致系统性能下降,数据的不可控性,尤其是跨表检测,
关于触发器的使用,有很多争议。
触发器的好处不言而喻是增强了数据的校验能力,能够有效地实现复杂的业务逻辑。在一定程度上走的比约束和check走的更远。
关于触发器的坏处,最典型的就是触发器的使用会导致系统性能下降,数据的不可控性,尤其是跨表检测,以及可能导致的触发器递归更加加深了数据的维护难度和不可控性。 ? 本文无意讨论触发器的原理和好坏,旨在描述一个关于批量数据提交时的触发器是如何设计的。 SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO CREATE TRIGGER [TRI_xxx] ON xxx
FOR INSERT,UPDATE
AS
SET NOCOUNT ON DECLARE
--检测标志设置
? @CHECK INT,???
--定义公共变量
? @TODAY DATETIME
--定义基表变量
? @field1 INT,
? @field2 INT,
? @field3 VARCHAR(20),
? @fieldN INT,
--定义跨表变量?
? @table1_field1 INT,
? @table1_field2 INT,
? @tableN_fieldM INT
--定义游标
? DECLARE cur_xxx CURSOR FOR
??? SELECT field1,field2,field3,fieldN FROM INSERTED
--如果非集合修改,则定义为如下
/*
SELECT @field1=field1,
?????? @field2=field2,
?????? @field3=field3,
?????? @field4=field4,
FROM INSERTED
*/ ? SET @TODAY=CONVERT(VARCHAR(10),GETDATE(),120)
?
? OPEN CUR_ZYGD
? FETCH NEXT FROM cur_xxx INTO @field1,@field2,@field3,@fieldN ? WHILE (@@FETCH_STATUS=0)
? BEGIN ------------------------------------------------------------------------
--------------------以下针对不同的规则,进行相关处理--------------------
------------------------------------------------------------------------ --满足某某条件,则不处理直接退出
? IF cond1
? BEGIN
??? CLOSE cur_xxx???????????? --非游标,无需该语句
??? DEALLOCATE cur_xxx??????? --非游标,无需该语句
??? RETURN
? END --满足某某条件,则提示处理直接退出
? IF cond2
? BEGIN?
??? RAISERROR('XXX错误!',16,1)
??? ROLLBACK TRAN
??? CLOSE cur_xxx???????????? --非游标,无需该语句
??? DEALLOCATE cur_xxx??????? --非游标,无需该语句
??? RETURN?
? END
?
--跨表检查,满足某某条件,则提示处理直接退出
? SELECT TOP 1 @table1_field1=field1 FROM table1 WHERE 1=1
? IF cond3 IS NOT NULL
? BEGIN
??? RAISERROR('XXX错误!',1)
??? ROLLBACK TRAN
??? CLOSE cur_xxx??????????? --非游标,无需该语句
??? DEALLOCATE cur_xxx?????? --非游标,无需该语句
??? RETURN?
? ELSE
? BEGIN
??? SET @field1=@table1_field1? --可能会根据其他跨表的结果更新当前值
? END?
?
? --最后根据主键更新相关值
? UPDATE xxx
???? SET field1=@field1,
???????? field2=@field2
?? WHERE PrimaryKey=@PrimaryKey AND (ISNULL(field1,'')<>ISNULL(@field1,'') OR ISNULL(field2,0)<>ISNULL(@field2,0)) ? FETCH NEXT FROM cur_xxx INTO @field1,@fieldN END CLOSE CUR_xxx
DEALLOCATE CUR_xxx SET NOCOUNT OFF GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读