0

Microsoft SQL Server を使用して、あるデータベースから別のデータベースにデータを移行しようとしています。どちらのデータベースにも、外部キーによって参照される「プロパティ/場所」タイプのテーブルがあります。

残念ながら、2 つのテーブルで参照されているエンティティは同じですが、主キーは同じではありません。そのため、データを移行するために、外部キー制約を一時的に無効にし、データを適切に挿入および更新してから、制約を再度有効にしようとしています。

ただし、次のメッセージが表示されます。

ALTER TABLE ステートメントが FOREIGN KEY 制約 "FK__TwelveCri__Store__114A936A" と競合しました。データベース「API」、テーブル「dbo.Properties」、列「ID」で競合が発生しました。

エラーがスローされる一般的な理由は理解できますが (表の列と の列StoreIDの一致が見つからない)、この特定のケースでエラーが発生する理由がわかりません。ReportsIDProperties

BEGIN TRAN
USE API;
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT ALL";

SET IDENTITY_INSERT Midamcorp.TwelveCriticalsReports ON;

INSERT INTO Midamcorp.TwelveCriticalsReports (ID, StoreID, InspectorName, ReportTime, ReportDate, PointsPoss, PointsReceived)
    SELECT 
        id, storeID, inspectorName, reportTIme, reportDate, pointsPoss, pointsReceived
    FROM 
        midAmCorp.dbo.criticalReports;

SET IDENTITY_INSERT Midamcorp.TwelveCriticalsReports OFF;

UPDATE API.Midamcorp.TwelveCriticalsReports 
SET StoreID = 1 
WHERE StoreID = 4;

!--- MORE UPDATE STATEMENTS HERE ---!

USE API

SET IDENTITY_INSERT Midamcorp.SecretShopperReportSummary ON;

INSERT INTO Midamcorp.SecretShopperReportSummary(ID, StoreID, PointsPoss, PointsReceived, DriveTime, CompletedBy, DateOfVisit)
    SELECT 
        id, storeID, pointsPoss, pointsReceived, driveTime, completedBy, dateOfVisit
    FROM 
        midamCorp.dbo.secretShopperReportSummary;

SET IDENTITY_INSERT  Midamcorp.SecretShopperReportSummary OFF;

!--- MORE UPDATE STATEMENTS HERE ---!


USE API

SET IDENTITY_INSERT Midamcorp.SecretShopperReportDetails ON;

INSERT INTO Midamcorp.SecretShopperReportDetails(ID, ReportID, QuestionID)
    SELECT 
        id, reportID, questionID 
    FROM 
        midAmCorp.dbo.secretShopperReportDetails;

SET IDENTITY_INSERT Midamcorp.SecretShopperReportDetails OFF;

SELECT * 
FROM Midamcorp.TwelveCriticalsReports 
WHERE StoreID NOT IN (SELECT StoreID FROM dbo.Properties);

EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL";

COMMIT TRAN;

最後のSELECTステートメントは結果を返しません。これは、リレーションシップが適切に更新された場合に期待されることです。EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL";ただし、おそらくステートメントから、上記のエラー メッセージがまだ表示されます。

アドバイスをいただければ幸いです。

4

0 に答える 0