次のように、データベースに 3 つのテーブルがあるとします。
Person
(personid
, ...) --- これはエンティティでpersonid
あり、ID 列ですPhone
(phoneid
, ...) --- これはエンティティでphoneid
あり、ID 列ですPersonPhone
(personid, phoneid
) ---この関係
テーブルにデータを挿入するときは、最初にエンティティ テーブルに行を挿入し、生成された を取得してid
から、関係テーブルに行を挿入する必要があります。
それはうまくいっています。質問: 次のTry Catch
ようなステートメントを含むトランザクションを含むストアド プロシージャがあります。
BEGIN TRY
declare aCursor cursor local fast_forward for (Select Query...)
open aCursor;
fetch next from aCursor into @variables....
while @@fetch_status = 0
begin
INSERT INTO Person(...);
set @personid =@@IDENTITY;
INSERT INTO Phone(...);
set @phoneid =@@IDENTITY;
INSERT INTO PersonPhone(@personid, @phoneid);
end;
END TRY
BEGIN CATCH
close aCursor;
deallocate selectdistributor;
SELECT ERROR_NUMBER() AS ErrorNumber,ERROR_MESSAGE() AS ErrorMessage;
ROLLBACK TRAN;
RETURN;
END CATCH
COMMIT;
close aCursor;
deallocate aCursor;
カーソルを使用すると、人、電話のレコードが挿入されます。SP を実行すると、リレーションシップへの最初のデータ挿入で停止します。また、正しい @personid、@phoneid を取得できますが、トランザクションが完了する前に、INSERT INTO PersonPhone(@personid, @phoneid); でエラーが発生します。なので:
INSERT ステートメントが FOREIGN KEY 制約 "Person_PersonPhone_FK1" と競合しました。データベース「MYDB」、テーブル「dbo.Person」、列「PersonID」で競合が発生しました。
システムによって生成された ID が、トランザクションが完了する前に認識されなかったようです。
この問題を解決するにはどうすればよいですか?