2012-07-27 20 views
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 

的觸發拷貝整行一個新的ID,如果原始行中的變化情況。 目前爲止這麼好。如果PRICEDESCRIPTION已更新,我希望觸發器僅創建一個新行。如果我在PRIORITYITEMNUMER或其他列上執行更新,則觸發器應只更新該行,但不會創建新行。

我該怎麼做?

回答

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 
+0

感謝您的代碼。如果我嘗試在瀏覽器中出現錯誤:您試圖更新的Datarow不再存在於數據源中,或者數據行不在可見頁面中。請刷新網格。 – Paks 2012-07-27 07:56:50

+0

@Paks這不是sql-server的錯誤,而是客戶端的錯誤。也許你試着在觸發器執行後更新表格?嘗試從ssms中更新行,以確保觸發器正常工作。 – 2012-07-27 08:15:11

+0

我可以更新價格和描述。到目前爲止它工作正常。觸發器使用新的ID和新的價格或描述複製整個行。但我不能更新優先級或其他colmuns。 – Paks 2012-07-27 08:29:32

相關問題