Могу ли я проверить наличие ограничений перед удалением в SQL Server? - PullRequest
4 голосов
/ 10 декабря 2008

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

Теперь я хочу иметь возможность проверить, произойдет ли ConstraintsViolation, прежде чем я вызову событие удаления строки.

Возможно ли это?

Ответы [ 5 ]

1 голос
/ 10 декабря 2008

Кроме проверки COUNT(*) каждой связанной таблицы? Я так не думаю.

1 голос
/ 10 декабря 2008
If Exists ( Select * From OtherTable
            Where OtherTableFKColumn = MainTablePrimaryKey) 
   Begin
       Rollback Transaction
       RaisError('Violating FK Constraint in Table [OtherTable]', 16, 1)
   End
0 голосов
/ 27 ноября 2009

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

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

0 голосов
/ 11 декабря 2008

Это вопрос, который на первый взгляд выглядит хорошо, но имеет значение.

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

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

Теперь, действительно ли исключение, которое вы получаете, кажется таким дорогим после этого испытания?

0 голосов
/ 11 декабря 2008

Одной из уродливых попыток было бы попытаться УДАЛИТЬ в транзакции, а затем вызвать ROLLBACK, если она прошла успешно. Но это грязно на мой вкус.

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