Я немного неясен относительно того, почему вы хотите иметь что-то подобное. Вы просто не разрешаете удаление дочерних записей в пользовательском интерфейсе, кроме вашего каскадного удаления, - просто не предоставляйте пользователю эту опцию.
Если вы беспокоитесь о некотором случайное DBA собирается в свою базу данных и запись:
delete from childTable where parentId = 5 -- or whatever
тогда я думаю, что у вас есть больше вещей, чтобы беспокоиться о ... например, почему люди с доступом для записи базы данных производства даже думают о том, чтобы вручную записывать и выполнять такие заявления, как это в вашей базе данных prod.
Если вы все еще действительно нужно было сделать что-то вроде этого. Вы могли бы написать триггер до удаления во всех дочерних таблицах, чтобы гарантировать, что parentId не существует в родительской таблице перед удалением. Это будет , вероятно, приведет к сбою вашего каскадного удаления (я бы догадался), поэтому вам нужно будет обновить свои функции удаления каскадов, чтобы отключить триггер перед удалением, снова включив триггер. Но это не помешает вашей «случайной дбе» просто сделать что-то подобное, отключив триггер, удалив запись и снова включив ее.
Если вы предоставили немного больше информации о конкретных сценариях того, почему детская запись будет удалена вручную, возможно, она сможет предложить больше.
Я думаю, вы неправильно поняли вопрос. OP хочет только разрешить удаление дочерней записи через удаление CASCADE и предотвращать удаление только в дочерней записи. –
Ребенок может быть случайно удален администратором через студию управления. Если мы отключим триггер, другие пользователи, которые одновременно работают, не смогут использовать триггер. – user1921730
администратор также может случайно отбросить все таблицы в вашей базе данных через студию управления. Это риск предоставить разрешения dbo любому человеку в вашей производственной базе данных. Я не совсем уверен, что вы надеетесь сделать здесь, не ограничивая доступ пользователей к своей базе данных. – Kritner