我有三個表,「elements」表中的行屬於「items」表中的一行,而該行又屬於「categories」表。 現在,我已經得到了觸發設置在每個表的更新上插入或更新時間戳(updatedAt):如何「級聯」更新時間戳(使用觸發器)
CREATE TRIGGER [Category_InsertUpdateDelete] ON [Category]
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
SET NOCOUNT ON;
IF TRIGGER_NESTLEVEL() > 3 RETURN;
UPDATE [Category] SET [Category].[updatedAt] = CONVERT (DATETIMEOFFSET(3), SYSUTCDATETIME())
FROM INSERTED
WHERE INSERTED.id = [Category].[id]
END
現在我試圖更新父行的時間戳這樣:
CREATE TRIGGER [Item_InsertUpdateDelete] ON [Item]
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
SET NOCOUNT ON;
IF TRIGGER_NESTLEVEL() > 3 RETURN;
DECLARE @updatedAt DATETIMEOFFSET(3) = CONVERT(DATETIMEOFFSET(3), SYSUTCDATETIME());
UPDATE [Item] SET [Item].[updatedAt] = @updatedAt
FROM INSERTED
WHERE INSERTED.id = [Item].[id]
UPDATE [Category] SET [Category].[updatedAt] = @updatedAt
FROM INSERTED
WHERE INSERTED.categoryId = [Category].[id] AND [Category].[updatedAt] < @updatedAt;
END
有雖然兩個問題:
1)它是造成死鎖,作爲該項目的觸發似乎在等待類別觸發,都希望更新的類別。
2)更新後的時間戳類別與項目時間戳記不同,因爲類別的觸發器會再次更改它(差異爲毫秒)。
我雖然使用UPDATE()函數來檢查updatedAt列是否在類別觸發器中發生了更改,但我不清楚這是否適用於批量插入/更新。檢查TRIGGER_NESTLEVEL是否可能導致這種「級聯」的特定觸發器,如果它返回的工作量超過0,則只是返回?
做這個時間戳的「級聯」的最佳方式是什麼?
在此先感謝!
嗯,這並不是真的有必要有這麼多的信息。只需要知道該行或其子代的最後更新時間。 我猜一個視圖不是一個選項;它用了很多。 UPDATE(updatedAt)函數如何在批量更新中工作? (我對此不確定)。在我看來,這將是最好的選擇。 將它們分開的優點是什麼? (我對觸發器不熟悉)顯然這段代碼對DELETE沒有用處。 – Alexander
@亞歷山大:我已經用例子更新了我的答案。 –
非常感謝!這些例子很棒。 – Alexander