如何拒绝所有用户在表上删除

时间:2010-09-03 04:16:27

标签: sql sql-server tsql

在SQL Server 2005中,是否有一种方法可以使用单个语句拒绝对行进行删除 在数据库的所有用户的特定表中?

4 个答案:

答案 0 :(得分:6)

试试这个:

CREATE TRIGGER yourTriggerName ON YourTableName
INSTEAD OF DELETE
AS

    ROLLBACK
    RAISERROR('ERROR, DELETEs not permitted in YourTableName!!!',16,1)
    RETURN

go

工作样本:

CREATE TABLE XYZ  (RowID int)
INSERT XYZ VALUES(1)
INSERT XYZ VALUES(2)
go 

CREATE TRIGGER yourTriggerName ON XYZ
INSTEAD OF DELETE
AS

    ROLLBACK
    RAISERROR('ERROR, DELETEs not permitted in XYZ!!!',16,1)
    RETURN

go

delete XYZ

输出:

Msg 50000, Level 16, State 1, Procedure yourTriggerName, Line 6
ERROR, DELETEs not permitted in XYZ!!!
Msg 3609, Level 16, State 1, Line 1
The transaction ended in the trigger. The batch has been aborted.

答案 1 :(得分:0)

有点极端,但您可以查看INSTEAD OF DELETE触发器来忽略删除。您可能会引发类似于“删除访问...被拒绝”的错误

显然,具有db_owner访问权限的用户可以放弃触发器

答案 2 :(得分:0)

如果要基于行的限制,请创建一个表(用于锁定)并插入要保护的行的ID。并创造一种关系。

答案 3 :(得分:0)

触发(或重构您的安全/权限模型)

权限无效的一个示例:如果存储了删除行的存储过程,并且proc / table具有相同的所有者,则表{}} {}}}表格权限将被检查,甚至是DENY。见ownership chaining。因此,用户可以删除或更改数据,而无需对表格拥有任何权利。