发布时对象名称无效:SQLPackage(DACFramework 15)可能的错误

时间:2019-02-08 17:39:33

标签: sql-server dacpac sqlpackage

在整个上午的大部分时间里,我一直在努力解决这个问题,我准备建议这是SqlPackage.exe中的错误

我使用以下命令提取dacpac:

C:\"Program Files"\"Microsoft SQL Server"\150\DAC\bin\SqlPackage.exe /a:Extract /ssn:$server /sdn:$dbName /st:300 /p:CommandTimeout=300 /tf:obj\$dbName\extracted.dacpac

并使用以下命令发布脚本:

C:\"Program Files"\"Microsoft SQL Server"\150\DAC\bin\SqlPackage.exe /a:Script /tcs:"Server=$server`;Database=$newDbName`;Trusted_Connection=True`;Connection Timeout=300`;" /p:CommandTimeout=300 /p:ExcludeObjectType=Logins /p:ExcludeObjectType=Users /p:ExcludeObjectType=RoleMembership /p:IgnoreNotForReplication=true /p:UnmodifiableObjectWarnings=false /sf:obj\$dbName\extracted.dacpac /op:obj\$dbName\publish_script.sql

该脚本会生成,但是当我尝试执行该错误时会失败:

Procedure MY_FUNCTION, Line 39 Invalid object name 'MY_OTHER_FUNCTION'

如果我检查脚本,可以看到以下内容:

LINE 300: PRINT N'Creating [dbo].[MY_FUNCTION]...'
... More code ...
LINE 400: PRINT N'Creating [dbo].[MY_OTHER_FUNCTION]...';

我已经深入研究提取的dacpac,以确认model.xml正在获取MY_FUNCTION对MY_OTHER_FUNCTION的依赖关系。我还验证了这不是循环依赖的情况。 MY_OTHER_FUNCTION依赖于在LINE 100上创建的一张表。

为什么生成的脚本无法按顺序创建它们?

1 个答案:

答案 0 :(得分:0)

好的,我确定这是一个错误。重现步骤:

  1. 创建一个新数据库。
  2. 运行以下创建脚本:

    在[PRIMARY]上创建表[dbo]。[someTable]([Id] [int] IDENTITY(1,1)NOT FOR REPLICATION NOT NULL) 开始

    创建函数[dbo]。[someOtherFunction](@ Id INT = 1)返回@someResults表(Id INT) 如 开始         插入@someResults(Id)         SELECT * FROM [sqlpackagebug]。[dbo]。[someTable] st WHERE @Id = st.Id         返回; 结束 开始

    创建函数[dbo]。[someFunction](@ Id INT = 1)返回表 如 返回 (     SELECT * FROM [sqlpackagebug]。[dbo] .someOtherFunction ) 开始

使用以下方法提取dacpac:

C:\"Program Files"\"Microsoft SQL Server"\150\DAC\bin\SqlPackage.exe /a:Extract /ssn:$server /sdn:$dbName /st:300 /p:CommandTimeout=300 /tf:extracted.dacpac

使用以下命令创建脚本

C:\"Program Files"\"Microsoft SQL Server"\150\DAC\bin\SqlPackage.exe /a:Script /tsn:$server /tdn:$newDbName /tt:300 /p:CommandTimeout=300 /sf:extracted.dacpac /op:script.sql

查看脚本,您会发现未按正确的顺序创建函数。该脚本将失败。