擷取資料層應用程式時,發生Error SQL71562的變通作法

擷取資料層應用程式時,發生Error SQL71562的變通作法

問題描述

朋友(Rock Chang)和筆者討論在SSMS 2012連接到SQL Server 2012來擷取資料層應用程式時,發生Error SQL71562的錯誤(詳細錯誤訊息如下)。

image

image

image

根據上述錯誤訊息看來,問題是發生在要匯出DAC的資料庫中存在預存程序(dbo.aaa)參考到其他資料庫的物件(資料庫abc中的資料表locktest),導致解析結構描述時發生錯誤。

重現問題步驟

您可以用下列T-SQL指令碼來建立測試資料庫abc和def,並且在資料庫adc中新增一個資料表locktest,最後在資料庫def中建立預存程序來跨資料庫select位於資料庫abc的資料表locktest。


--建立測試資料庫
Create database abc
go

create database def
go

--建立資料表
use abc
go

create table locktest
(c1 int)
go

--新增資料
insert into locktest values (1),(2),(3)
go


--建立Stored Procedure
use def
go

create proc dbo.aaa
as
select * from abc.dbo.locktest
go

--測試Stored Procedure
exec def.dbo.aaa
go


--刪除測試資料庫
--use master
--go

--drop database abc
--go

--drop database def
--go

 

接著在物件總管,資料庫def節點上按滑鼠右鍵選擇【工作>擷取資料層應用程式】。

image

依照擷取資料層應用程式精靈的指引,一路按下一步就可以重現上一節的錯誤。

image

image

image

image

變通作法

在SSMS中直接擷取資料層應用程式會發生失敗,可以改用SqlPackage.exe命令列公用程式,該程式不受跨資料庫的限制,但比較麻煩就是需要自己下指令,沒辦法透過GUI的方式來操作。

下列指令碼示範透過SqlPackage.exe命令列公用程式從本機(/ssn:.)將指定的資料庫(/sdn: def)擷取資料層應用程式(/a:extract),並指定DAC封裝檔的存放路徑(/tf: "d:\def.dacpac")。

SqlPackage.exe /a:extract /ssn:. /sdn:def /tf:"d:\def.dacpac"

image

由上圖可知透過SqlPackage.exe命令列公用程式就不會受到跨資料庫存取資料庫物件的限制,已經成功將資料庫def的結構描述擷取出來,您可以在SSDT中開啟資料庫專案,並匯入DAC封裝檔來驗證原本造成錯誤的預存程序是否已經被正確擷取出來(如下圖)。

image

參考資料

Reverse Engineer a MDS database as a .dacpac generates errors

SqlPackage.exe

延伸閱讀

利用 SqlPackage.exe 公用程式複製資料庫