繁体   English   中英

SQL Server 触发器 if update() with condition

[英]SQL Server trigger if update() with condition

我在 SQL Server 中有一个包含 3 列的表: IDNAMEVALUE

该表有 2 行ID=1ID=2

(ID 的值不变)。

每时每刻, VALUE列的值都会发生变化。 每次VALUE列发生变化时,我都想将这个更新后的值插入到表中(ID=1 的设备 1,ID=2 的设备 1)。

我创建了一个更新触发器,就像 update(VALUE) 开始一样......但它不起作用。

有没有办法在 if update(VALUE) 中添加条件以在每一行中工作

我使用了这个查询

Create Trigger insertIntoDevices
On ITEMS
For Update
As
    If Update(VALUE)
    Begin
        Insert Into table device1 
        Where ID = 1

        Insert Into table device2
        Where ID = 2
    End

通过此查询,VALUE 列中的每个更新都会将 VALUE 插入到 device1 和 device1 中,这会复制我的表 device1 和 device2 中的值。

在下面创建表;

 CREATE TABLE TestTable(
        ID      INT IDENTITY(1,1),
        Name    VARCHAR(5),
        VALUE   NVARCHAR(50)
    )
    
    GO
    CREATE TABLE device1(
        VALUE NVARCHAR(50)
    )
    GO
    CREATE TABLE device2(
        VALUE NVARCHAR(50)
    )
    GO

ID=1 和 ID=2 的插入

GO
INSERT INTO TestTable(Name,Value)
VALUES('Test1','test1'),('TEST2','test2')

首先,要为每一行查找新值,您可以使用“插入”,但它可以包含未更改的数据。 例如:ID =1,Name='test1' and VALUE='test1' name 列的更新也会包含在 inserted 中。

其次,要查找每一行的旧值,您可以使用“已删除”。

之后,我们找到仅包含 VALUE 更新的值。

总结一下,查找插入的行和删除的行将为我们提供每行新值和旧值的结果。 我们使用交集 (INNER JOIN) 来查找仅更改的值。

CREATE TRIGGER [dbo].[insertIntoDevices]
   ON [dbo].[TestTable]
   AFTER UPDATE
AS 
BEGIN
    DECLARE @InsertedTable table (
        InsertedID      INT,
        InsertedName    VARCHAR(5),
        InsertedVALUE   NVARCHAR(50)
    )
    DECLARE @DeletedTable table (
        DeletedID       INT,
        DeletedName     VARCHAR(5),
        DeletedVALUE    NVARCHAR(50)
    )


    INSERT INTO @InsertedTable(InsertedID,InsertedName,InsertedVALUE)
    SELECT ID,[Name],[Value] FROM inserted;  

    INSERT INTO @DeletedTable(DeletedID,DeletedName,DeletedVALUE)
    SELECT ID,Name,Value FROM deleted;
    
    INSERT INTO device1(VALUE)
    SELECT  UpdatedValue    = it.InsertedVALUE
    FROM @InsertedTable as it
    INNER JOIN @DeletedTable as dt ON it.InsertedID = dt.DeletedID AND ISNULL(dt.DeletedVALUE,'') <> ISNULL(it.InsertedVALUE,'')
    WHERE it.InsertedID = 1
    
    INSERT INTO device2(VALUE)
    SELECT  UpdatedValue    = it.InsertedVALUE
    FROM @InsertedTable as it
    INNER JOIN @DeletedTable as dt ON it.InsertedID = dt.DeletedID AND ISNULL(dt.DeletedVALUE,'') <> ISNULL(it.InsertedVALUE,'')
    WHERE it.InsertedID = 2
END

为了测试我在下面使用了更新查询;

 --Example 1
UPDATE TestTable
SET Value='selam'
WHERE ID = 1


--Example 2
UPDATE TestTable
SET Value='hi'
WHERE ID = 2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM