Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как правильно запретить удаление таблиц в базе?  [new]
кладовщик
Member

Откуда:
Сообщений: 563
Есть домашняя БД на MS SQL 2005 XE, для работы с ней часто использую MS Access - adp. Решил для подстраховки запретить удаление таблиц вручную, оставить только возможность программного удаления. Быстрое гугление подсказало вар-т с созданием триггера DDL.
CREATE TRIGGER trg_NoDrop ON DATABASE FOR DROP_TABLE AS
ROLLBACK;

Правильно я понимаю, что нужно в хранимой процедуре перед DROP TABLE прописать DISABLE TRIGGER, а потом после всех делов ENABLE и все будет ок, таблицы удалять будет нельзя?
И вообще, концептуально это правильный вар-т, с триггером ДДЛ или есть более верные?
-----
Не люблю Progress OpenEdge.
25 окт 12, 08:31    [13372114]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно запретить удаление таблиц в базе?  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
кладовщик,

Может создать Триггер INSTEAD OF DELETE, и там проверять условие
SELECT APP_NAME() 
25 окт 12, 10:02    [13372440]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно запретить удаление таблиц в базе?  [new]
Алексей Дарьин
Member

Откуда:
Сообщений: 13
кладовщик,
Не уверен насчет правильности использования ROLLBACK. На мой взгляд там ошибку нужно генерировать.
Другой вариант - работать через пользователя, которому запрещено удалять таблицы.
25 окт 12, 10:15    [13372517]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно запретить удаление таблиц в базе?  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Алексей Дарьин,

в хелпе приводят подобный пример с ROLLBACK, поэтому сомнений быть не должно.
CREATE TRIGGER trg_NoDrop ON DATABASE FOR DROP_TABLE AS
AS 
   RAISERROR ('You must disable Trigger!',10, 1)
   ROLLBACK
GO

А мое решение было для кокретной таблицы, на удаление записей. Оно для решения данной задачи не подходит.
25 окт 12, 10:22    [13372564]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно запретить удаление таблиц в базе?  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
кладовщик,

Можно сделать такую проверку в триггере
IF NOT EXISTS(SELECT 1 WHERE SUSER_NAME() ='login_user_aaaa')
    ROLLBACK

Вместо 'login_user_aaaa', напишите свой логин.
25 окт 12, 10:33    [13372639]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно запретить удаление таблиц в базе?  [new]
кладовщик
Member

Откуда:
Сообщений: 563
trew, да, с проверкой юзера в триггере более подходящий вар-т. Наверное его буду использовать. Спасибо.
25 окт 12, 11:02    [13372839]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно запретить удаление таблиц в базе?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Правильнее не давать права на DROP
25 окт 12, 11:03    [13372852]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно запретить удаление таблиц в базе?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34620
кладовщик,

Может легче права на удаление отобрать просто? Будешь права себе выдавать, и удалять, притом убирать.
Или ты dba? Тогда можно стать обычным юзером.
25 окт 12, 11:34    [13373092]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно запретить удаление таблиц в базе?  [new]
портер
Guest
MasterZiv, Glory а при отсутствии права на ДРОП хранимая процедура, в кот-й таблица дропается, отработает?
25 окт 12, 12:11    [13373385]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно запретить удаление таблиц в базе?  [new]
skorpk
Member

Откуда: Волгоград
Сообщений: 273
портер
MasterZiv, Glory а при отсутствии права на ДРОП хранимая процедура, в кот-й таблица дропается, отработает?

А у вас в процедуре можно удалять объекты?
25 окт 12, 13:31    [13374021]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно запретить удаление таблиц в базе?  [new]
skorpk
Member

Откуда: Волгоград
Сообщений: 273
портер, Уберите db_owner у пользователя и дайте только права которые необходимы пользователю.
25 окт 12, 13:36    [13374066]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно запретить удаление таблиц в базе?  [new]
skorpk
Member

Откуда: Волгоград
Сообщений: 273
кладовщик, Что ручное, что программно для сервера. Вам нужно смотреть из какого приложение исходит команда на удаление.
25 окт 12, 13:39    [13374081]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно запретить удаление таблиц в базе?  [new]
aWlad
Member

Откуда: Москва
Сообщений: 42
Вот Glory ведь ответил : не давать права.
А триггер - лишнее "колесо".
Вообще, правильно давать минимум прав. В данном случае - пользователям запретить удалять, приложению - разрешить.
25 окт 12, 16:50    [13375744]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно запретить удаление таблиц в базе?  [new]
портер
Guest
aWlad
Вот Glory ведь ответил : не давать права.
А триггер - лишнее "колесо".
Вообще, правильно давать минимум прав. В данном случае - пользователям запретить удалять, приложению - разрешить.

Это так для кучи пользователей, кот-х нужно администрировать. Но в случае, если я единственный пользователь, разработчик и dbo, это чересчур, наверное. Я от своих "заплетающихся пальцев" хочу предохраниться.
На ноутбуке в adp пару раз промахивался и удалял нужные таблицы.
25 окт 12, 18:23    [13376261]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно запретить удаление таблиц в базе?  [new]
портер
Guest
я тредстартер.
25 окт 12, 18:25    [13376268]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить