2014-10-30 5 views
-1

При удалении основной записи каскадный триггер будет запущен и удалит записи в дочерних таблицах. И я не могу удалить запись вручную из таблицы, поскольку она получила отношение внешнего ключа с дочерней таблицей.Как предотвратить удаление дочерней записи

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

ответ

1

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

Если вы беспокоитесь о некотором случайное DBA собирается в свою базу данных и запись:

delete from childTable where parentId = 5 -- or whatever 

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

Если вы все еще действительно нужно было сделать что-то вроде этого. Вы могли бы написать триггер до удаления во всех дочерних таблицах, чтобы гарантировать, что parentId не существует в родительской таблице перед удалением. Это будет , вероятно, приведет к сбою вашего каскадного удаления (я бы догадался), поэтому вам нужно будет обновить свои функции удаления каскадов, чтобы отключить триггер перед удалением, снова включив триггер. Но это не помешает вашей «случайной дбе» просто сделать что-то подобное, отключив триггер, удалив запись и снова включив ее.

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

+0

Я думаю, вы неправильно поняли вопрос. OP хочет только разрешить удаление дочерней записи через удаление CASCADE и предотвращать удаление только в дочерней записи. –

+0

Ребенок может быть случайно удален администратором через студию управления. Если мы отключим триггер, другие пользователи, которые одновременно работают, не смогут использовать триггер. – user1921730

+0

администратор также может случайно отбросить все таблицы в вашей базе данных через студию управления. Это риск предоставить разрешения dbo любому человеку в вашей производственной базе данных. Я не совсем уверен, что вы надеетесь сделать здесь, не ограничивая доступ пользователей к своей базе данных. – Kritner

1

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

Пример сценария:

USE [YOUR_DB] 
GO 
DENY DELETE ON [dbo].[YOUR_TABLE] TO [DOMAIN\user] 
GO 

Заменить [dbo] с соответствующим именем схемы и заменить [DOMAIN\user] с соответствующим пользователем.

+0

Спасибо, Таннер. Но мне нужно удалить записи из дочерней таблицы при удалении соответствующих записей в главной таблице. т.е. при удалении записи в главной таблице запускается каскадный триггер удаления, чтобы удалить записи из дочерней таблицы. В этом случае, если мы применим Deny delete, удаление каскада будет неудачным или нет. – user1921730

+1

кто именно вас беспокоит «вручную» удаление записей?вашего приложения или пользователей домена? – Kritner

+1

@ user1921730, поэтому приложение или ваши пользователи sys admin имеют разрешение на удаление записей по мере необходимости, но у всех других пользователей есть разрешения DENY. Поэтому любые случайные пользователи, которых вы беспокоитесь, не смогут удалить записи из дочерней таблицы. Если есть еще одна проблема, обновите свой вопрос со сценариями и более подробной информацией, чтобы прояснить ситуацию. – Tanner