我有一個名爲Prices
的SQL Server表,它包含數萬行數據。該表格被傳統應用程序嚴重使用,不幸的是無法修改(不能添加,刪除或修改列)。將插入或更新另一個表的SQL Server TRIGGER
我的要求是跟蹤表的修改時間(INSERT, UPDATE, or DELETE
)。但是,Prices
表沒有LastUpdated
列,我無法添加此列。此外,我的觸發器必須與SQL Server 2005
我不過可以創建一個額外的表,PricesHistory
將存儲PriceID
,UpdateType
和LastUpdated
列兼容。
我想一個SQL TRIGGER
附加到Prices
表要麼INSERT
或UPDATE
在PricesHistory
表中的行,這將跟蹤,當價格最後更新,哪些操作觸發它的。
這是我到目前爲止,它將檢測哪個操作導致觸發器觸發。然而,我很難從inserted
或deleted
表SELECT
表中做出正確的INSERT/UPDATE
到PricesHistory
表。
基本上,所有的操作都應該檢查PriceID
在PriceHistory
表已經存在,並且UPDATE
的UpdateType
和LastUpdated
列。如果PriceID
尚不存在,它應該INSERT
它連同UpdateType
和LastUpdated
值。
編輯:它已經被同事的inserted
和deleted
項目行不錶帶到了我的注意。這意味着我可以做一個簡單的IF EXISTS ... UPDATE ELSE INSERT INTO
條款。這是真的?我的印象是它將成爲行的表格,而不是單獨的行。
CREATE TRIGGER PricesUpdateTrigger
ON Prices
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
-- Log an insertion record
END
IF @UpdateType = 'U'
BEGIN
-- Log an update record
END
IF @UpdateType = 'D'
BEGIN
-- Log a deletion record
END
GO
插入/更新不是表!不適用於MS SQL Server。也許你的同事正在把事情與甲骨文混合起來。對於MS SQL Server,它可以是隻有一行的表,但它是一張表。 – jean
對不起,我的意思是它是一排單排。如果你做了一個批量的'UPDATE'或'DELETE',觸發器會觸發每一行。 – Erik
不,觸發器會在每次操作時觸發,而不是每行觸發。如果您的操作只是更新,則會在您的應用程序特定行爲時插入一行。我只是想爲觀衆澄清一下。 – jean