【发布时间】:2021-09-25 11:16:52
【问题描述】:
我有一个场景,某些用户必须有权更新或删除生产中的某些记录。我想要做的是确保他们不会意外更新或删除表的大部分(或整个),而只是根据他们的需要只更新或删除几条记录。所以我写了一个简单的触发器来完成这个。
CREATE TRIGGER delete_check
ON dbo.My_table
AFTER UPDATE,DELETE AS
BEGIN
IF (SELECT COUNT(*) FROM Deleted) > 15
BEGIN
RAISERROR ('Bulk deletes from this table are not allowed', 16, 1)
ROLLBACK
END
END --end trigger
但这就是问题所在。有一个存储过程可以对表进行批量更新。用户可以并且应该被允许调用存储过程,因为它的范围更受限制。所以不幸的是,我的触发器会阻止他们在需要时调用存储的过程。
我想到的唯一解决方案是以模拟用户身份运行存储过程,然后修改触发器以将该用户排除在逻辑之外。但这会在我的环境中带来其他问题。不是无法克服,但很烦人。不过,这似乎是唯一可行的选择。
我的想法是正确的,还是有更好的方法?
【问题讨论】:
-
也许保存一个
SESSION_CONTEXT然后在触发器中读回它。顺便说一句,你不应该在触发器中RAISERROR/ROLLBACK,而只是THROW,回滚会自动发生
标签: sql sql-server tsql triggers