擷取資料層應用程式時,發生Error SQL71562的變通作法
問題描述
朋友(Rock Chang)和筆者討論在SSMS 2012連接到SQL Server 2012來擷取資料層應用程式時,發生Error SQL71562的錯誤(詳細錯誤訊息如下)。
根據上述錯誤訊息看來,問題是發生在要匯出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節點上按滑鼠右鍵選擇【工作>擷取資料層應用程式】。
依照擷取資料層應用程式精靈的指引,一路按下一步就可以重現上一節的錯誤。
變通作法
在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"
由上圖可知透過SqlPackage.exe命令列公用程式就不會受到跨資料庫存取資料庫物件的限制,已經成功將資料庫def的結構描述擷取出來,您可以在SSDT中開啟資料庫專案,並匯入DAC封裝檔來驗證原本造成錯誤的預存程序是否已經被正確擷取出來(如下圖)。
參考資料
Reverse Engineer a MDS database as a .dacpac generates errors