Я пытаюсь создать триггер, который будет вставлять записи в таблицу OH_PONUMBER_AUDIT на основе обновления столбца PONUMBER в таблице REPORDER, но я не знаю, как вставлять записи, используя новые и старые значения столбцов в SQL Server.

У меня есть триггер, подобный этому в DB2, поэтому я предполагаю, что функциональность должна существовать в SQL Server.

Заранее спасибо

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER [DBO].[PONUMBER_AUDIT]
ON [DBO].[REPORDER] 
AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    IF UPDATE (PONUMBER)
    BEGIN
        INSERT INTO [DBO].[OH_PONUMBER_AUDIT] 
           ([ORDERNUM]
           ,[USER_WHO_CHANGED]
           ,[DATE_CHANGED]
           ,[FIELD_CHARGED]
           ,[OLD_VALUE]
           ,[NEW_VALUE])
            SELECT 
                ORDERNUM, SESSION_USER, GETDATE(), 'PONUMBER', O.PONUMBER, N.PONUMBER 
            FROM 
                [TFW].[DBO].[REPORDER];
    END
END
0
OVO 24 Апр 2017 в 23:54

2 ответа

Лучший ответ

Вам необходимо использовать псевдо таблицы INSERTED и DELETED:

CREATE TRIGGER [DBO].[PONUMBER_AUDIT]
    ON [DBO].[REPORDER] 
    AFTER UPDATE
AS BEGIN
    SET NOCOUNT ON;
    IF UPDATE (PONUMBER)
    BEGIN

        INSERT INTO [DBO].[OH_PONUMBER_AUDIT] 
           ([ORDERNUM]
           ,[USER_WHO_CHANGED]
           ,[DATE_CHANGED]
           ,[FIELD_CHARGED]
           ,[OLD_VALUE]
           ,[NEW_VALUE])
        SELECT  I.ORDERNUM, 
                SESSION_USER, 
                GETDATE(), 
                'PONUMBER', 
                D.PONUMBER, 
                I.PONUMBER 
        FROM INSERTED I 
        INNER JOIN DELETED D
            ON I.[ORDERNUM] = D.[ORDERNUM];
    END
END

Этот код предполагает, что ORDERNUM является первичным ключом таблицы.

3
Lamak 25 Апр 2017 в 12:57

В TRIGGER вы должны использовать таблицы inserted и deleted.

Вместо использования: IF UPDATE (PONUMBER) я бы предложил использовать

IF EXISTS (SELECT     1 
           FROM       inserted
           INNER JOIN deleted
           ON         inserted.<key_field> = deleted.<key_field>
           WHERE      inserted.PONUMBER <> deleted.PONUMBER)


USE [TFW]
GO 
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [DBO].[PONUMBER_AUDIT]
    ON [DBO].[REPORDER] 
    AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    IF UPDATE (PONUMBER)
    BEGIN

        INSERT INTO [DBO].[OH_PONUMBER_AUDIT] 
           ([ORDERNUM]
           ,[USER_WHO_CHANGED]
           ,[DATE_CHANGED]
           ,[FIELD_CHARGED]
           ,[OLD_VALUE]
           ,[NEW_VALUE])
        SELECT     ORDERNUM, 
                   SESSION_USER, 
                   GETDATE(), 
                   'PONUMBER', 
                   O.PONUMBER, 
                   N.PONUMBER 
        FROM       inserted
        INNER JOIN deleted
        ON         inserted.<KEY_FIELD> = deleted.<KEY_FIELD> 
        WHERE      inserted.PONUMBER <> deleted.PONUMBER

    END
END
1
McNets 24 Апр 2017 в 20:59