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

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

Я хотел бы (например) отменить удаление строки, если id равен 0,1 или 2

Это делается для того, чтобы пользователи не удалили основные учетные записи для приложения, и я бы хотел избежать этого, даже если кто-то пытается (по ошибке) его использовать с помощью sql напрямую.

Благодаря!

РЕДАКТИРОВАТЬ:

Вся идея этого вопроса – не касаться приложения. Это не вопрос безопасности, мне просто нужно знать, можно ли делать то, что я просил, с ограничениями или любыми другими вещами, которые имеет SQL Server (это не должно быть стандартным решением db).

EDIT 2:

Образцы кода очень, очень оценены: D

Что касается принудительного применения этого ограничения , моим решением было бы создать зависимую таблицу, поэтому ссылочные строки не могут быть удалены.

CREATE TABLE NoKillI ( id INT NOT NULL, FOREIGN KEY (id) REFERENCES Accounts(id) ON DELETE RESTRICT ); INSERT INTO NoKillI (id) VALUES (0); INSERT INTO NoKillI (id) VALUES (1); INSERT INTO NoKillI (id) VALUES (2); 

Теперь никто не может удалять строки в Accounts с идентификационными значениями 0, 1 или 2, если только они не удаляют первые строки в NoKillI . Вы можете ограничить удаление против зависимой таблицы с помощью привилегий SQL.

Вы делаете это, написав триггер базы данных, который запускается на DELETE для рассматриваемой таблицы. Все, что нужно сделать, это выбросить исключение, если идентификатор недействителен.

Если вы не доверяете своим пользователям, добавьте безопасность.

  1. Добавьте хранимую процедуру, которая позволяет пользователям удалять строки, в которых они хотят, но запретить то, что вы хотите, согласно вашим собственным правилам. Затем запретить удаление доступа в таблице и разрешить выполнение доступа к sproc
  2. Добавьте вторичную таблицу с ссылками на внешние ключи, вызовите таблицу MasterAccounts или аналогичные, запретите доступ к обновлению и удалению в эту таблицу и добавьте ссылки на нее в соответствующие учетные записи, это не позволит никому удалять учетную запись, если есть ссылка из этой таблицы на него
  3. Добавьте триггер, как предлагает OrbMan
  4. Добавьте представление, в котором они могут удалять строки, сделать представление пропустить все те учетные записи, которые им не разрешено удалять, запретить удаление доступа к главной таблице и разрешить удаление доступа к просмотру

Сказав это, если у ваших пользователей достаточно доступа, чтобы поговорить с вашей базой данных через SQL, тогда вы действительно просто просите о проблемах. Вы должны усилить безопасность и только разрешить доступ к базе данных через ваше приложение и установленные протоколы. Тогда у вас есть много вариантов, чтобы избежать подобных проблем.

Я использую следующий триггер:

 CREATE TRIGGER [dbo].[mytable_trd] ON [dbo].[mytable] WITH EXECUTE AS CALLER INSTEAD OF DELETE AS BEGIN SET NOCOUNT ON DECLARE @tn varchar(255) SELECT @tn = object_name(parent_obj) FROM sysobjects WHERE id = @@procid; SET @tn = 'Deletes not allowed for this table: ' + @tn; -- Add your code for checking the values from deleted IF EXISTS(select * from deleted where mycolumn = 1) RAISERROR (@tn, 16, 1) END GO 

Вы уверены, что это правда, что вы никогда не захотите кого-либо удалить эти строки? Даже вы сами, или дба? Или dbms ремонтные работы?

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

Решение, которое я предпочитаю, использует реляционную модель и ее правила целостности.

Для каждой записи в Tbl_Account которая не может быть удалена, я бы добавил запись в Tbl_AccountMaster где Tbl_Account.id_Account является внешним ключом. Tbl_AccountMaster не доступен для обновления, кроме администратора базы данных. Затем никто не сможет удалить записи из Tbl_Account , связанные с Tbl_AccountMaster .

EDIT: Я только заметил, что здесь была разработана одна и та же идея. Спасибо, Билл!

Вы можете попробовать фильтровать свои запросы с помощью функции, которая проверяет, не пытается ли пользователь удалить вашу главную учетную запись.

  • Два внешних ключа ссылаются на один стол - ON UPDATE SET NULL не работает
  • GETDATE в ограничении DEFAULT для некоторых таблиц в SQL Server 2012
  • Как сделать это ограничение в SQL Server?
  • UNIQUE CONSTRAINT в столбце из внешней таблицы в SQL Server 2008
  • Проект SugarCRM и ошибка ограничения SQL Server / ошибка
  • Ограничение, которое позволяет только одной из двух таблиц ссылаться на базовую таблицу
  • Ограничение проверки не работает в SQL Server 2016
  • Ограничение проверки SQL Server
  • Разница между ограничениями и правилами в SQL
  • Проверить ограничение. Подзапросы в этом контексте запрещены.
  • Вопрос о ограничениях SQL
  • Давайте будем гением компьютера.