1

次の SQL トリガーがあります。

ALTER TRIGGER [dbo].[DIENSTLEISTUNG_Update]
ON [dbo].[DIENSTLEISTUNG]
INSTEAD OF UPDATE
AS
BEGIN

SET  NOCOUNT ON;


        INSERT INTO [DIENSTLEISTUNG] 
                 (DESCRIPTION, QUANTITY, 
                  PRICE, AZ_MO, AZ_DI,AZ_MI,AZ_DO,AZ_FR,
                  AZ_SA,AZ_SO,DIENSTLEISTUNGSART_ID,
                  UPDATE_USER, UPDATE_DATE,
                  PERMISSIONS, KONTRAKTPOSITION,ITEMNUMBER,
                  PRIORITY, VALID)
        SELECT  DESCRIPTION, QUANTITY, PRICE AZ_MO, AZ_DI,AZ_MI,AZ_DO,AZ_FR,
                AZ_SA,AZ_SO,SERVICETYPE_ID, UPDATE_USER,GETDATE(),
                PERMISSIONS, KONTRAKTPOSITION,ITEMNUMBER, PRIORITY, 'Y',VALID
        FROM INSERTED

        UPDATE  SERVICE
        SET  VALID = 'N' 
        FROM    SERVICE
                INNER JOIN INSERTED ON INSERTED.ID = SERVICE.ID



SET  NOCOUNT OFF;      
END

元の行が変更された場合、Trigger は行全体を新しい ID でコピーします。ここまでは順調ですね。PRICEまたはDESCRIPTIONが更新された場合にのみ、トリガーが新しい行を作成するようにします。PRIORITYまたはまたは他の列で更新​​を行うとITEMNUMER、トリガーは行を更新するだけで、新しい行は作成しません。

どうやってやるの?

4

2 に答える 2

1

INSERTED および DELETED テーブルを使用できます。

INSERT INTO [DIENSTLEISTUNG] 
         (DESCRIPTION, QUANTITY, 
          PRICE, AZ_MO, AZ_DI,AZ_MI,AZ_DO,AZ_FR,
          AZ_SA,AZ_SO,DIENSTLEISTUNGSART_ID,
          UPDATE_USER, UPDATE_DATE,
          PERMISSIONS, KONTRAKTPOSITION,ITEMNUMBER,
          PRIORITY, VALID)
SELECT  i.DESCRIPTION, i.QUANTITY, i.PRICE, i.AZ_MO, i.AZ_DI,i.AZ_MI,i.AZ_DO,i.AZ_FR,
        i.AZ_SA,i.AZ_SO,i.SERVICETYPE_ID, i.UPDATE_USER,GETDATE(),
        i.PERMISSIONS, i.KONTRAKTPOSITION,i.ITEMNUMBER, i.PRIORITY, 'Y',i.VALID
FROM INSERTED i
     JOIN deleted d ON i.ID=d.ID
WHERE i.PRICE<>d.PRICE
      or i.DESCRIPTION<>d.DESCRIPTION

    UPDATE  S
    SET  s.VALID = 'N',
         s.priority=i.priority,
         s.QUANTITY =i.QUANTITY,
         ...  
    FROM    SERVICE s
            JOIN INSERTED i ON I.ID = S.ID
            JOIN deleted d ON i.ID=d.ID
    WHERE i.PRICE=d.PRICE
          or i.DESCRIPTION=d.DESCRIPTION
于 2012-07-27T07:29:46.903 に答える
0

COLUMNS_UPDATED プロパティを確認する必要があります。結果の値は、テーブルの構造によって異なります。

http://msdn.microsoft.com/en-us/library/ms186329.aspx

または、削除されたテーブルと挿入されたテーブルの値を比較できます。

于 2012-07-27T07:19:33.780 に答える