Есть ли способ указать каскадное удаление для запроса по запросу? - PullRequest
0 голосов
/ 15 октября 2010

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

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

Мы рассмотрели следующие варианты:

  1. Игнорируем наши инстинкты и настраиваем каскадированиеудаляет в любом случае
  2. Вместо каскадного удаления используйте значение null
  3. Пишите и поддерживайте пользовательский сценарий для удаления всех записей внешнего ключа вручную

Ни одна из этих опций не являетсяотлично: - (

  1. Мы не хотим устанавливать каскадное удаление, потому что не хотим, чтобы это было поведением по умолчанию.
  2. Мы не хотим использовать каскадированиеnull, потому что оставлять много сирот было бы бесполезно.
  3. Написание нестандартного сценария работало бы, но это не очень масштабируемое и не обслуживаемое. Написание сценария за грехХороший стол или даже несколько столов в порядке, но для каждого стола?Шутки в сторону?Должен быть лучший способ!По крайней мере, я надеюсь есть лучший способ.

Для толпы "Слишком долго не читал";Краткое резюме

Есть ли способ указать, что вы хотите удалить каскадно, на основе запроса к запросу?

Возможно, что-то похожее на это:

-- wouldn't it be nice if this was a real command!
CASCADE DELETE FROM MyTable WHERE ID = @ID

1 Ответ

4 голосов
/ 15 октября 2010

Я не уверен, что действительно вижу полезность ручного каскадного варианта в вашем случае. КАСКАД существует для поддержания определенных отношений между сущностями, и если вы, и я цитирую,

не хочу, чтобы это было поведение по умолчанию

что тогда можно еще:

  • выдает несколько запросов, которые будут выполнять очистку "вручную"
  • используйте хранимые процедуры, если вы хотите сделать это с помощью одного вызова, например, у вас может быть CALL CASCADE_DELETE('table_name', 'id = 3') (и вы получите единственную точку, в которой вы будете поддерживать свои сценарии очистки)
  • используйте триггеры, если вы хотите быть модным (например, вы можете создать простые представления для исходных таблиц, где удаление из этих представлений будет каскадным - вместо этого будут триггеры, а удаление из исходных таблиц не будет каскадным)

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

EDIT: Если цель состоит в том, чтобы очистить тестовые данные, чтобы они соответствовали действующим правилам целостности, вы можете создать надлежащие таблицы с надлежащими правилами, а затем переместить данные из таблиц тестовых данных в надлежащие таблицы. Строки, которые не соответствуют надлежащей целостности, не смогут выполнить вставку, и вы получите чистые данные.

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