我有三个表,“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