Как запретить удаление на столе для всех пользователей - PullRequest
4 голосов
/ 03 сентября 2010

В SQL Server 2005 существует ли способ с помощью одного оператора запретить удаление строк в определенной таблице для всех пользователей базы данных?

Ответы [ 4 ]

6 голосов
/ 03 сентября 2010

попробуйте это:

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.
0 голосов
/ 04 сентября 2010

Только запускает (или изменяет модель безопасности / разрешений)

Один пример, когда разрешения не помогут: если у вас есть хранимые процедуры, которые удаляют строки, и обе таблицы / proc имеют одного и того же владельца, разрешения для таблицы not будут проверены, даже DENY. См. цепочка владения . Таким образом, пользователи могут удалять или изменять данные без каких-либо прав на таблицу вообще.

0 голосов
/ 03 сентября 2010

, если вы хотите ограничить строки, создайте таблицу (для блокировки) и вставьте идентификаторы строк, которые вы хотите защитить. и создайте отношения.

0 голосов
/ 03 сентября 2010

Вид экстрима, но вы можете посмотреть на триггер INSTEAD OF DELETE , чтобы игнорировать удаления. Вы можете вызвать ошибку, похожую на «удалить доступ ... отказано»

Очевидно, что пользователи с правами доступа db_owner могут сбросить триггер

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...