Как создать триггер в SQL Server, который срабатывает только непосредственно перед тем, как транзакция будет зафиксирована

Итак, я столкнулся с проблемой, которая выглядит следующим образом:
— у меня есть таблица A.
— у меня есть таблица B, у которой есть внешний ключ для таблицы A.
— у меня есть триггер для таблицы A, который гарантирует, что каждый элемент в таблице A имеет по крайней мере одну строку в таблице B, указывающую на него (через внешний ключ).
— триггер срабатывает для команд «вставить».

Теперь проблема в том, что когда я вставляю в таблицу A, триггер вызывает ошибку, потому что в таблице B еще нет строки с внешним ключом для новой строки в таблице A. Строка в таблице B будет вставлена ​​к концу транзакции, но триггер не дает мне такой возможности.

Так что же является хорошим решением проблемы? Есть ли способ заставить триггер запускаться только после выполнения последней команды в транзакции?


person AxiomaticNexus    schedule 07.08.2013    source источник
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
comment
Проблема в том, что я не могу вставить в таблицу B перед вставкой в ​​таблицу A. Помните, что один из столбцов в таблице B является внешним ключом для таблицы A, и его нельзя установить, пока строка в таблице A не будет вставлена ​​и не назначен идентификатор , идентификатор, который затем будет использоваться для столбца внешнего ключа в таблице B. - person AxiomaticNexus; 08.08.2013
comment
Вы не сможете делать то, что хотите, за рамками триггера вместо триггера. Вы можете использовать триггер вместо триггера для таблицы A, чтобы выполнить вставку в a, а затем использовать предложение output для загрузки таблицы B. - person Adam Haines; 08.08.2013