Итак, я столкнулся с проблемой, которая выглядит следующим образом:
— у меня есть таблица A.
— у меня есть таблица B, у которой есть внешний ключ для таблицы A.
— у меня есть триггер для таблицы A, который гарантирует, что каждый элемент в таблице A имеет по крайней мере одну строку в таблице B, указывающую на него (через внешний ключ).
— триггер срабатывает для команд «вставить».
Теперь проблема в том, что когда я вставляю в таблицу A, триггер вызывает ошибку, потому что в таблице B еще нет строки с внешним ключом для новой строки в таблице A. Строка в таблице B будет вставлена к концу транзакции, но триггер не дает мне такой возможности.
Так что же является хорошим решением проблемы? Есть ли способ заставить триггер запускаться только после выполнения последней команды в транзакции?
Как создать триггер в SQL Server, который срабатывает только непосредственно перед тем, как транзакция будет зафиксирована
comment
почему вы используете триггеры для обеспечения связи с внешним ключом? Это уже сделано с помощью внешнего ключа. То, что вам нужно, это триггер на A, чтобы сделать требуемую вставку в B
- person Marc B   schedule 07.08.2013
comment
Переместите свой триггер из таблицы A в таблицу B
- person Louis Ricci   schedule 07.08.2013
comment
Марк Б. Триггер не должен применять внешний ключ. Триггер должен обеспечить, чтобы таблица B имела хотя бы одну строку, ссылающуюся на таблицу A.
- person AxiomaticNexus   schedule 07.08.2013
comment
LastCoder — у меня уже есть версия для таблицы B, но мне нужна другая версия для таблицы A, потому что можно вставить в таблицу A без вставки соответствующей строки в таблицу B.
- person AxiomaticNexus   schedule 07.08.2013
comment
Есть ли способ заставить триггер запускаться только после выполнения последней команды в транзакции? -› Нет. И мне интересно, как будет развиваться это обсуждение.
- person OzrenTkalcecKrznaric   schedule 07.08.2013
Ответы (1)
Если вам нужен триггер для запуска таблицы A, но вы не знаете, есть ли соответствующие строки в таблице b, вы должны использовать триггер «INSTEAD OF». Это позволит вам проверить таблицу B перед вставкой строк в таблицу A. Если есть совпадение в таблице B, продолжите вставку в A, в противном случае добавьте строку в b, а затем в A, или пропустите данные, которые не совпадают, и вернуть ошибку в приложение.
http://msdn.microsoft.com/en-us/library/ms175521(v=SQL.105).aspx
person
Adam Haines
schedule
07.08.2013
Проблема в том, что я не могу вставить в таблицу B перед вставкой в таблицу A. Помните, что один из столбцов в таблице B является внешним ключом для таблицы A, и его нельзя установить, пока строка в таблице A не будет вставлена и не назначен идентификатор , идентификатор, который затем будет использоваться для столбца внешнего ключа в таблице B.
- person AxiomaticNexus; 08.08.2013
Вы не сможете делать то, что хотите, за рамками триггера вместо триггера. Вы можете использовать триггер вместо триггера для таблицы A, чтобы выполнить вставку в a, а затем использовать предложение output для загрузки таблицы B.
- person Adam Haines; 08.08.2013