微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

关于触发器的使用,有很多争议。 触发器的好处不言而喻是增强了数据的校验能力,能够有效地实现复杂的业务逻辑。在一定程度上走的比约束和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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐