Перед триггером в SQL Server - PullRequest
       15

Перед триггером в SQL Server

1 голос
/ 12 ноября 2009

У меня есть 2 таблицы: survey (id(PK), name) и survey_to_topic (survey_id(PK,FK,not null), topic_id(PK,FK,not null)). Когда я пытаюсь удалить из таблицы опроса, я получаю исключение:

"Оператор DELETE конфликтует с ССЫЛОЧНОЕ ограничение "FK_survey _to _topic _survey". конфликт произошел в базе данных "mydatabase", таблица столбец "dbo.survey _to _topic" 'survey _id'. "

Таким образом, чтобы сначала не было ошибок, я должен удалить запись из таблицы survey_to_topic, а затем из таблицы survey. Я думаю, что это лучше делать перед триггером на столе, но я не могу найти никакой информации об этом. В PL / SQL есть много статей о триггерах перед запуском, но я использую SQL Server.

Ответы [ 4 ]

6 голосов
/ 12 ноября 2009

Вы можете добавить ON DELETE CASCADE к взаимосвязи между двумя таблицами, и записи из таблицы survey_to_topic будут автоматически удалены.

См. http://msdn.microsoft.com/en-us/library/aa933119(SQL.80).aspx

1 голос
/ 12 ноября 2009

Как уже упоминали Алекс Дим и Астандер - вы должны использовать ON DELETE CASCADE для отношений с внешним ключом - это автоматически обрабатывает этот сценарий для вас.

SQL Server не знает понятия BIGORE (операция) TRIGGERs - SQL Server имеет триггеры AFTER или триггеры INSTEAD OF. См. Введение в триггеры для получения дополнительной информации.

Но ON DELETE CASCADE, безусловно, самый простой способ сделать это.

1 голос
/ 12 ноября 2009

Вы можете использовать ON DELETE CASCADE. Это добавляется в таблицу, содержащую FK.

См. Пример здесь .

0 голосов
/ 12 ноября 2009

Как и все здесь упоминавшиеся, ON DELETE CASCADE - это путь, если вы знаете о последствиях; есть причина, по которой ON DELETE NO ACTION (ошибка повышения) используется по умолчанию. Другими словами, вы должны спланировать свою стратегию удаления - слишком легко непреднамеренно уничтожить строки из нескольких таблиц с помощью ON DELETE CASCADE.

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