表数据修改触发器,单条数据和多条数据带游标触发器
需求背景:
一个表存在批量间隔5秒数据被外部更新一次,在刷新前把数据进行安装转移并处理
需求分析:
建立表新增修改触发器,通过监控表的数据进行数据安全转移,起初发现数据是一条条被修改的,所以建立了一个简单的触发器,后来在调试测试过程中需要批量处理数据,所以单条修改的触发器已不满足需求,并存在批量修改报错的情况,比如批量提交UPDATE不带条件,或修改的影响行大于1。
编写目的:
项目经理,重拾技术,处理技术问题。
SQL代码:
单条修改触发器响应
USE [DeviceCollection] GO /****** Object: Trigger [dbo].[DeviceTagDataRefreshUpdateTgr] Script Date: 2023/8/26 9:25:12 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER trigger [dbo].[DeviceTagDataRefreshUpdateTgr] on [dbo].[DeviceTagDataRefresh] for INSERT,UPDATE --插入触发 as --定义变量 declare @Id int; SET @Id=0; PRINT '进入DeviceTagDataRefreshUpdateTgr触发器'; select @Id=Id from [dbo].[DeviceTagMap] WHERE OrgTagName =(SELECT TagName FROM inserted) PRINT @Id; if(@Id>0) BEGIN INSERT INTO [dbo].[DeviceTagData](DataTime,TagValue,DeviceTagMapId) SELECT [Time],ParameterValue,@Id FROM inserted; END ELSE BEGIN --写入日志提醒,有新增加点位,查看是否需要录入 INSERT INTO [dbo].[DeviceTagData](DataTime,TagValue,DeviceTagMapId) SELECT [Time],ParameterValue,1 FROM inserted; END
多条触发器响应
USE [DeviceCollection] GO /****** Object: Trigger [dbo].[DeviceTagDataRefreshUpdateTgr] Script Date: 2023/8/26 8:53:10 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER trigger [dbo].[DeviceTagDataRefreshUpdateTgr] ON [dbo].[DeviceTagDataRefresh] FOR INSERT,UPDATE --插入触发 AS --定义变量 DECLARE @DeviceTagMapId int,@Time Datetime,@TagName NVARCHAR(100),@ParmeterValue NVARCHAR(100),@ParameterDes NVARCHAR(100); SET @DeviceTagMapId=0; PRINT '进入DeviceTagDataRefreshUpdateTgr触发器'; IF((SELECT count(*) FROM INSERTED)>1) --更新的数据行大于1 BEGIN PRINT '进入DeviceTagDataRefreshUpdateCur游标'; DECLARE DeviceTagDataRefreshUpdateCur cursor forward_only for select [Time],[TagName],[ParameterValue],[ParameterDes] from INSERTED OPEN DeviceTagDataRefreshUpdateCur --打开游标,注意黄色部分个数、类型一定要对应,否则会出错 FETCH NEXT FROM DeviceTagDataRefreshUpdateCur into @Time,@TagName,@ParmeterValue,@ParameterDes WHILE(@@FETCH_STATUS=0) --此句已经把字段保存到了变量中 BEGIN SELECT @DeviceTagMapId=Id from [dbo].[DeviceTagMap] WHERE OrgTagName = @TagName IF(@DeviceTagMapId>0) BEGIN --写入数据采集数据 INSERT INTO [dbo].[DeviceTagData](DataTime,TagValue,DeviceTagMapId) Values(@Time,@ParmeterValue,@DeviceTagMapId); END ELSE BEGIN --写入数据采集数据,默认写入关系id=0; INSERT INTO [dbo].[DeviceTagData](DataTime,TagValue,DeviceTagMapId) Values(@Time,@ParmeterValue,1); END fetch next from DeviceTagDataRefreshUpdateCur into @Time,@TagName,@ParmeterValue,@ParameterDes --指向下一条 END CLOSE DeviceTagDataRefreshUpdateCur; --关闭游标 DEALLOCATE DeviceTagDataRefreshUpdateCur; --销毁游标资源 PRINT '关闭DeviceTagDataRefreshUpdateCur游标'; END ELSE BEGIN select @DeviceTagMapId=Id from [dbo].[DeviceTagMap] WHERE OrgTagName =(SELECT TagName FROM INSERTED) PRINT @DeviceTagMapId; IF(@DeviceTagMapId>0) BEGIN --写入数据采集数据 INSERT INTO [dbo].[DeviceTagData](DataTime,TagValue,DeviceTagMapId) Values(@Time,@ParmeterValue,@DeviceTagMapId); END ELSE BEGIN PRINT '写入未找到关系的数据'; --写入数据采集数据,默认写入关系id=0; INSERT INTO [dbo].[DeviceTagData](DataTime,TagValue,DeviceTagMapId) Values(@Time,@ParmeterValue,1); END END PRINT '结束DeviceTagDataRefreshUpdateTgr触发器';