[英]How to update all fields dynamically in Instead of UPDATE trigger SQL Server
我在SQL服务器中实现而不是UPDATE触发器,想要更新所有字段而不需要缓存INSERTED表中的值,然后将其设置为UPDATE Query中的字段。我该怎么做?!
CREATE TRIGGER trg_Instead_updTable1 ON dbo.Table1
INSTEAD OF UPDATE
AS
BEGIN
IF (UPDATE(ID))
RAISERROR ('It is not allowed to update a Table1.ID', 16, 1)
ELSE
BEGIN
UPDATE dbo.Table1
SET * = (SELECT * FROM INSERTED JOIN DELETED ON INSERTED.ID = DELETED.ID)
END
END
您不需要使用INSTEAD OF UPDATE
触发器。 只有当您想要完全绕过所有正常的表更新逻辑并执行完全自定义的操作时,才需要这些。 通常,这是在复杂视图上放置触发器时完成的。
你说你想拒绝更新一个值。 没问题。 你可以这样做:
CREATE TRIGGER dbo.Table1_UPDATE on Table1 FOR UPDATE AS
IF UPDATE(ID)
BEGIN
RAISERROR('You may not update the ID', 16, -1)
ROLLBACK TRANSACTION
RETURN
END
GO
RAISERROR
当然会提出错误,提醒用户他们做了坏事。 有人可能会认为这会暂停执行并回滚更新,但它既不会执行(除非XACT_ABORT
为ON
)。
ROLLBACK TRANSACTION
将撤消整个更新,将表恢复到尝试UPDATE
之前的状态。
RETURN
退出触发器代码。 可能没有必要继续进一步处理。
如果您确实想要更新基表,请按以下步骤操作:
UPDATE t1 SET
field1 = i.field1,
field2 = i.field2,
-- all additional fields go here
FROM Table1 t1
INNER JOIN inserted i ON i.id = t1.id
inserted
是一个虚拟表,包含整个行以及新值。 deleted
具有插入之前的行。 因此可以使用它们来查看哪些值发生了变化。
旁注:如果字段是IDENTITY
列,则无论如何都无法更新它,这样就不需要这样的触发器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.