表数据修改触发器,单条数据和多条数据带游标触发器

发布时间 2023-08-26 10:09:54作者: shexunyu

需求背景:

  一个表存在批量间隔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触发器';