SQL 触发器使另一个 table 保持最新

SQL Trigger for keeping another table up to date

我以前没有使用过触发器,但它们似乎是解决这个问题的方法。

我想要一个 table,其中包含来自两个 table 的最新记录:Item_MasterDev_Master -> Union_Master

我主要不明白的是插入和删除'tables'。如果我想更新一行(更新一行时),如何访问插入的 tables 列?

这是我目前的情况:

ALTER TRIGGER [dbo].[DevMasterChangeTrigger]
ON [dbo].[DEV_MASTER]
AFTER INSERT, UPDATE, DELETE
AS
    DECLARE @UpdateType nvarchar(1)
    DECLARE @UpdatedDT datetime

    SELECT @UpdatedDT = CURRENT_TIMESTAMP

    SET NOCOUNT ON;

    IF EXISTS (SELECT * FROM inserted)
       IF EXISTS (SELECT * FROM deleted)
          SELECT @UpdateType = 'U'    -- Update Trigger
       ELSE
          SELECT @UpdateType = 'I'    -- Insert Trigger
    ELSE
       IF EXISTS (SELECT * FROM deleted)
          SELECT @UpdateType = 'D'    -- Delete Trigger
       ELSE
          SELECT @UpdateType = NULL;  -- Unknown Operation

    IF @UpdateType = 'I'
    BEGIN
        PRINT 'Insert'
    END

    IF @UpdateType = 'U'
    BEGIN
        UPDATE dbo.UNION_MASTER 
        SET PRDNO = inserted.PRDNO & 'abc' 
        WHERE dbo.DEV_MASTER.PRDNO = inserted.PRDNO
    END

    IF @UpdateType = 'D'
    BEGIN
        PRINT 'Delete'
    END

另外,有没有关于沉浸在 MS SQL Server 中的好书?

编辑:好的,对于任何偶然发现此问题的人 post,我已经弄明白了。希望我没有错过任何导致问题的细微差别。删除部分对我来说有点困惑...

USE [abc]
GO
/****** Object:  Trigger [dbo].[DevMasterChangeTrigger]    Script Date: 10/04/15 12:43:43 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[DevMasterChangeTrigger]
ON [dbo].[DEV_MASTER]
AFTER INSERT, UPDATE, DELETE
AS
DECLARE @UpdateType nvarchar(1)
DECLARE @UpdatedDT datetime

SELECT @UpdatedDT = CURRENT_TIMESTAMP



IF EXISTS (SELECT * FROM inserted)
    IF EXISTS (SELECT * FROM deleted)
        SELECT @UpdateType = 'U'    -- Update Trigger
    ELSE
        SELECT @UpdateType = 'I'    -- Insert Trigger
ELSE
    IF EXISTS (SELECT * FROM deleted)
        SELECT @UpdateType = 'D'    -- Delete Trigger
    ELSE
        SELECT @UpdateType = NULL;  -- Unknown Operation

IF @UpdateType = 'I'
BEGIN
   INSERT INTO [UNION_MASTER]
   (PRDID, {Insert various fields here})
   SELECT [inserted].[PRDID],   [inserted].{Insert various fields here}
   FROM inserted 
END

IF @UpdateType = 'U'
BEGIN
    UPDATE [UNION_MASTER] 
    SET 
    [UNION_MASTER].[abcdfield]=[inserted].[abcdfield], {other fields here}
    FROM inserted
    WHERE [UNION_MASTER].[PRDNO]=inserted.prdno     
END

IF @UpdateType = 'D'
BEGIN
    declare @prdno varchar(50)
    SELECT @prdno= PRDNO FROM deleted
    DELETE 
    FROM UNION_MASTER 
    WHERE PRDNO = @prdno
END

简而言之,inserteddeletedtable是特殊的table,可以在DML触发器中使用。这些 table 包含基于对触发器执行的 DML 操作的行。

inserted table 包含为 insert 语句插入的行的数据或在 update

的情况下新修改的行

已删除 table 包含在 delete 操作中删除的行或在 update

的情况下已修改的旧数据

在你的触发器中,你可以尝试这样的事情

ALTER TRIGGER [dbo].[DevMasterChangeTrigger]
ON [dbo].[DEV_MASTER]
AFTER INSERT, UPDATE, DELETE
AS
    DECLARE @UpdateType nvarchar(1)
    DECLARE @UpdatedDT datetime

    SELECT @UpdatedDT = CURRENT_TIMESTAMP

    SET NOCOUNT ON;

    IF EXISTS(SELECT * FROM inserted) AND EXISTS(SELECT * FROM deleted)
          SELECT @UpdateType = 'U'    -- Update Trigger
       ELSE IF EXISTS(SELECT * FROM inserted)
          SELECT @UpdateType = 'I'    -- Insert Trigger
       ELSE IF EXISTS (SELECT * FROM deleted)
          SELECT @UpdateType = 'D'    -- Delete Trigger
       ELSE
          SELECT @UpdateType = NULL;  -- Unknown Operation

    IF @UpdateType = 'I'
    BEGIN
        PRINT 'Insert'
        // add appropriate logic here
    END

    IF @UpdateType = 'U'
    BEGIN
        UPDATE U dbo.UNION_MASTER 
        SET PRDNO = inserted.PRDNO & 'abc'
        FROM dbo.UNION_MASTER U
        inner join inserted i -- this table will have the rows affected from update statement for table DEV_MASTER
        on i.<UNION_MASTER_ID> = U.<UNION_MASTER_ID> -- USE appropriate joining condition
    END

    IF @UpdateType = 'D'
    BEGIN
        PRINT 'Delete'
        // add appropriate logic here
    END

参考链接

https://msdn.microsoft.com/en-us/library/ms191300.aspx

http://www.mssqltips.com/sqlservertip/2342/understanding-sql-server-inserted-and-deleted-tables-for-dml-triggers/