SQL Server BACPAC导入错误 - 外键约束冲突(SQL72014 / Msg 547)
我正在尝试通过SQL Server Management Studio使用一个 .BACPAC 文件导出/导入SQL Server数据库,但导入时出现外键约束错误。
导入时错误:
Error SQL72014: Framework Microsoft SqlClient Data Provider: Msg 547, Level 16, State 0
The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_TmX_Loan__Order_22800C64".The conflict occurred in database "edufi-prod-upgrade-test", table "dbo.TmX_Order", column 'Order_ID'.
Error SQL72045: Script execution error.
PRINT N'Checking constraint: FK_TmX_Loan__Order_22800C64 [dbo].[TmX_Loan_Application]';
ALTER TABLE [dbo].[TmX_Loan_Application]
WITH CHECK CHECK CONSTRAINT [FK_TmX_Loan__Order_22800C64];
数据库关系:
dbo.TmX_Loan_Application.Order_ID → dbo.TmX_Order.Order_ID
为了检查孤儿记录,我运行了:
SELECT A.Order_ID
FROM dbo.TmX_Loan_Application A
LEFT JOIN dbo.TmX_Order O ON A.Order_ID = O.Order_ID
WHERE O.Order_ID IS NULL;
在目标/导入数据库中,这个查询返回了:
Order_ID
--------
20635
然而,当我检查生产环境的SQL Server时,并不存在孤儿记录。生产环境中的同一查询返回零行,意味着所有 Order_ID 值在 TmX_Loan_Application 中存在于 TmX_Order。
在将数据库导出为一个 .BACPAC 时,Azure SQL数据库DTU使用量在此过程中飙升至100 DTU。
如果生产数据库中没有孤儿记录,为什么在 .BACPAC 导入时会出现外键冲突?
解决方案
来自 "Export to a BACPAC File" 文档:
为了使导出在事务上保持一致,您必须确保导出过程中没有写入活动,或您正在从数据库的一个事务一致的副本进行导出。
是否有可能.BACPAK是从一个活动数据库创建的,在提取 TmX_Order 表数据和提取 TmX_Loan_Application 表数据之间,对源数据库进行了修改?这会解释你遇到的错误。
我不是Azure专家,但 这个回答 暗示一个解决方案可能是:
- 对数据库进行备份,或找到最近的一个现成备份。 (备份在事务上应保持一致。)
- 将该备份还原到一个不同的数据库名称,例如 "XYZ_Copy"。
- 从 "XYZ_Copy" 数据库创建一个.BACPAC文件。
- 删除 "XYZ_Copy" 数据库。
如果这是常规的SQL Server,我会建议创建一个 数据库快照 并从中导出,但我不知道Azure是否有等效的能力。