2015-07-03 48 views
0

SQL Server触发器是否可以防止更新记录并允许插入新记录?触发器阻止更新,但允许插入

感谢, Przemek

+2

限制用基于权限是最好的。它可以用触发器来完成,但是会有开销。你能否更详细地解释你的情况,也许有更好的方法来实现你想要的。 – Greg

+0

我有一个Customers表(Id,Name,City,ValidFrom,ValidTo)。要跟踪更改,我想通过添加新记录来允许更改,而不是更新当前。我看到了 –

+0

,所以如果有人想要发布更新,你究竟期待什么发生?你想要抛出一个错误吗?你想用更新替换更新吗? – Greg

回答

1

无法通过这个创建具有INSERT在目标表的访问,但不更新访问SQL Server用户来完成?没有权限创建新用户,那么:

GRANT INSERT ON [blah] TO [user] 

我承认,我的SQL Server的知识触发器是有限的,但是这似乎像它会工作。

+0

我想显示个别的错误信息,因此可以触发。 –

+1

权限可以控制非特权用户直接访问表,但不会阻止通过存储过程进行更新,假设所有权链不间断。 –

1

要扩大INSTEAD OF UPDATE,这个触发条件会为UPDATE命令。 INSERTDELETE命令照常工作;如果您想拦截那些使用INSTEAD OF INSERTINSTEAD OF DELETE触发器的人。

的完整的解决方案是这样的:在RAISERROR

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

更多信息here。基本上第二个参数(18)是严重性,其中18是允许用户定义的异常的最高严重性。第三个参数(0)是您通常不需要的“状态”,因此为零。

再举一个例子:如果你想防止UPDATEDELETE,你会使用这样的:

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 
+0

这个问题似乎有点复杂,我期望 - 我已创建新线程来覆盖它:http://stackoverflow.com/questions/31219607/trigger-to-block-some-updates-and-allow-inserts –