Как сделать INSERT в таблицы с круговыми отношениями (SQL SERVER)

Я имею дело с набором таблиц в базе данных, которые, как представляется, имеют круговые отношения (см. Изображение). Это база данных ARTS, если какая-либо помощь кому-либо.

Циркулярная ссылка на сервере Sql

Включение пользователя:

  • a) должен создать сеанс (вставить), который, в свою очередь, требует SessionStartTransactionID (= SignOnTransaction)
  • б) SignOnTransaction – это тип ControlTransaction
  • c) ControlTransaciton – это тип транзакции
  • d) Транзакция требует ссылки на существующую сессию (вместе с Оператором и т. д.),

Примечание. Transaction.SessionStartTransactionID, Transaction.OperatorID и Transaction.WorkStationID (thoese 3 являются составным первичным ключом в сеансе) не могут быть NULL в таблице транзакций.

Я не могу понять, как создать (вставить) SignOnTransaction или вставить в любую из таблиц, упомянутых выше.

Как вы это делаете в SQL Server? Возможно ли это? С чего бы начать? Благодаря!

Solutions Collecting From Web of "Как сделать INSERT в таблицы с круговыми отношениями (SQL SERVER)"

Если что-то, что вы описываете, невозможно, вы понимаете это неправильно. Вы не можете иметь таблицу A, у которой есть требуемый ключ, который ссылается на таблицу B, которая имеет необходимый ключ, который ссылается на таблицу A. Один из двух ключей должен иметь значение NULL , или отношения с предыдущим ключом не выполняются.

Некоторые идеи

Учитывая, что Session использует StartTransactionID как часть его первичного ключа, означает, что он не может быть нулевым, поэтому представляется вероятным, что StartTransactionID в транзакции может быть нулевым, чтобы вы вставляли Transaction , затем ControlTransaction, затем SignOnTransaction then Session , а затем обновляете транзакцию, которая был создан с идентификатором. (Если FK не был применен, вы можете пропустить обновление и просто использовать то же значение для PK, если оно не является столбцом Indentity).

Единственное возможное решение, о котором я могу думать, заключается в том, что каждый раз, когда вы впервые вставляете транзакцию , вы должны использовать ALTER TABLE Transaction NOCHECK CONSTRAINT StartTransactionIDconstraint_name , а затем восстанавливать ограничение после обновления таблицы. Похоже, это хакерское решение. Тем более, что вы не можете делать ALTER TABLE в транзакции, чтобы вы оставались открытым для множества проблем.

Поскольку это, как представляется, является частью производственной системы, почему бы вам не запустить SQL Trace, чтобы узнать, как данные заселяются. Это помогает мне все время.