Проблема внешнего ключа с несколькими дБ в одной транзакции - PullRequest
0 голосов
/ 31 января 2011

У меня есть одна БД, скажем, DB1, при добавлении одного столбца в одной таблице (DB1.t1) на DB1, запускает и создает реплику той же строки в таблице с тем же именем (DB2.t1) в другой DB2.Используя идентификатор вставленной строки, мне нужно добавить несколько строк в другую таблицу (DB2.t2) в DB2.

Проблема в том, что мне нужно вставить в DB1.t1 и DB2.t2 в одной транзакции.При попытке сделать это, DB1.t1 вставляет нормально, но так как он не зафиксирован, DB2.t1 не содержит строки, поэтому DB2.t2 не может вставить новые строки (отсутствует внешний ключ), тем не менее, когда отправляются данные из приложениядолжным образом.

Одной из опций является слишком фиксация транзакции DB1, а затем выполнение операции DB2, но есть и другие функциональные возможности.Пожалуйста, предложите лучший способ достичь этого.

Ответы [ 2 ]

3 голосов
/ 05 февраля 2011

Ну, Id столбцы не являются значимыми "ключами", и они вас всех перепутают.Предполагается, что они являются бессмысленными физическими идентификаторами, и вы придаете им значение.Когда вы требуете, чтобы такой же Ids существовал в другой базе данных.

Урегулировали ли вы нарушение ФК?Скорее всего, у вас есть совершенно другой Id для строки DB1 в DB2;и, конечно, другой родительский элемент Ids.

Необходимо последовательно not указать значение Id и позволить серверу заполнить его, либо всегда указатьЗначение Id в обеих базах данных.

Вторая проблема заключается в том, что вы не используете транзакцию.Транзакции с несколькими дБ вообще не проблема.Так что забудьте о столбце Id, который в нем содержится, и используйте реальные ключи для таблицы в обоих базах данных.ids будет другим, но кого это волнует (это означает избавление от необходимости придавать значение бессмысленному идентификатору).

0 голосов
/ 31 января 2011

Делайте все это за одну транзакцию в хранимой процедуре.Посмотрите, как совершать транзакции в Книгах онлайн.Убедитесь, что вставили откат, если он содержит ошибки (используйте try catch catch).ТАКЖЕ получить идентификатор из таблицы 1 с помощью предложения OUTPUT или Scope_identity ().

...