Добавление ограничения или иное предотвращение удаления записи в таблице БД SQL - PullRequest
1 голос
/ 16 декабря 2010

У меня есть таблица в базе данных SQL Server, которая содержит строку, которую я никогда не хочу удалять.Это строка, необходимая приложению для работы, как задумано.

Есть ли способ добавить ограничение для этой строки, которое предотвращает ее удаление?Или другой способ справиться с этим сценарием?

Ответы [ 3 ]

3 голосов
/ 16 декабря 2010

Если вы хотите предотвратить случайное удаление, тогда вы можете иметь фиктивную таблицу, которая объявляет внешний ключ в вашей таблице с помощью ON DELETE NO ACTION, и добавить в нее одну строку с внешним ключом, совпадающим с вашим 'драгоценным' строка первичного ключа. Таким образом, если родительская строка будет удалена, механизм откажется и выдаст ошибку.

Если вы хотите предотвратить преднамеренное удаление, вам следует полагаться на безопасность (запретить разрешение DELETE для таблицы). Конечно, привилегированные пользователи, имеющие необходимые разрешения, могут удалить строку, не может предотвратить это, и вы не должны пытаться. Поскольку SQL Server не поддерживает безопасность на уровне строк, если вам нужно запретить только определенные строки, вам придется вернуться к чертежу в целом и изменить макет таблицы, чтобы сохранить все строки, которые должны быть отклонены. в одной таблице, а строки, которые разрешено удалять, хранятся в другой таблице.

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

3 голосов
/ 16 декабря 2010

Вот пример использования триггера FOR DELETE для предотвращения удаления строки при выполнении определенного условия:

CREATE TRIGGER KeepImportantRow ON MyTable
  FOR DELETE
AS BEGIN
    -- This next line assumes that your important table has a
    -- column called id, and your important row has an id of 0.
    -- Adjust accordingly for your situation.
    IF DELETED.id = 0 BEGIN
        RAISERROR('Cannot delete important row!', 16, 1)
        ROLLBACK TRAN
    END
END
1 голос
/ 16 декабря 2010

Вы можете сделать это несколькими способами, хотя это зависит от ситуации.

Если таблица содержит только эту строку, не предоставляйте привилегий удаления / усечения.

Если таблица содержит и другие строки, вы можете использовать триггер перед удалением.

Одна из проблем, с которой вы столкнетесь, заключается в том, что кто-то, имеющий доступ DBA / SA к базе данных, может обойти все, что вы вставите, если он пожелает, и то, от чего вы пытаетесь защитить, случайного пользователя или кого-либо еще.

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