Sql 触发器以防止更新但允许插入

Sql 触发器以防止更新但允许插入,sql,sql-server,triggers,Sql,Sql Server,Triggers,SQL Server触发器能否阻止更新记录并允许插入新记录 谢谢, Przemek这难道不能通过创建一个对目标表具有INSERT访问权限但不具有UPDATE访问权限的SQL Server用户来实现吗?创建没有权限的新用户,然后: GRANT INSERT ON [blah] TO [user] 我承认,我对SQL Server触发器的了解是有限的,但这似乎是可行的。要防止表上的更新,可以使用“而不是更新”Trriger 您可以选中此注释“”以展开而不是更新,此触发器将为更新命令触发INSERT

SQL Server触发器能否阻止更新记录并允许插入新记录

谢谢,
Przemek

这难道不能通过创建一个对目标表具有INSERT访问权限但不具有UPDATE访问权限的SQL Server用户来实现吗?创建没有权限的新用户,然后:

GRANT INSERT ON [blah] TO [user]

我承认,我对SQL Server触发器的了解是有限的,但这似乎是可行的。

要防止表上的更新,可以使用“而不是更新”Trriger
您可以选中此注释“”

以展开
而不是更新,此触发器将为
更新
命令触发
INSERT
DELETE
命令正常工作;如果您想截取其中一个,您可以使用
而不是INSERT
而不是DELETE
触发器

完整的解决方案如下所示:

CREATE TRIGGER myTable_IO_Upd ON myTable INSTEAD OF UPDATE AS
BEGIN
  RAISERROR('myTable does not allow UPDATE queries.', 18, 0);
END;
GO
CREATE TRIGGER myTable_IO_Upd ON myTable INSTEAD OF UPDATE, DELETE AS
BEGIN
  RAISERROR('myTable does not allow UPDATE or DELETE queries.', 18, 0);
END;
GO
有关
RAISERROR
的更多信息,请参阅。基本上,第二个参数(18)是严重性,18是用户定义异常允许的最高严重性。第三个参数(0)是“状态”,您通常不需要它,因此为零

再举一个例子:如果要防止
更新
删除
,可以使用以下方法:

CREATE TRIGGER myTable_IO_Upd ON myTable INSTEAD OF UPDATE AS
BEGIN
  RAISERROR('myTable does not allow UPDATE queries.', 18, 0);
END;
GO
CREATE TRIGGER myTable_IO_Upd ON myTable INSTEAD OF UPDATE, DELETE AS
BEGIN
  RAISERROR('myTable does not allow UPDATE or DELETE queries.', 18, 0);
END;
GO

基于权限进行限制是最好的。这可以通过触发器来完成,但是会有开销。你能更详细地解释一下你的情况吗?也许有更好的方法来实现你的目标。我有一个客户表(Id、姓名、城市、ValidFrom、ValidTo)。为了跟踪更改,我希望通过添加新记录而不是更新当前记录来允许更改。我明白了,所以如果有人想发布更新,您希望发生什么?是否要抛出错误?是否要将更新替换为更新?问题似乎比我预期的要复杂一些-我创建了新线程来解决它:我希望显示单个错误信息,以便优先触发。权限可以控制非特权用户直接访问表,但不会阻止通过存储过程进行更新,假设所有权链没有断裂。谢谢。穆罕默德。问题是:如何允许在这样的触发器中插入?您可以使用普通权限“Grant”来允许插入使用此触发器进行控制更新我需要对您的案例进行更多说明,以便为您提供更好的解决方案问题似乎比我预期的更复杂-我创建了新线程来解决问题:问题似乎比我预期的更复杂-我创建了新线程来解决问题: