通过Powershell部署dacpac导致错误:“无法确定域的身份”

时间:2014-01-09 13:32:35

标签: sql-server powershell dacpac

是否有其他人遇到过与下述问题类似的问题?

我在使用Powershell部署SQL Server 2012 dacpac数据库升级时遇到问题。详情如下:

它是为sql server 2012构建的dacpac文件,我正在尝试通过以管理员身份登录时从命令行运行的Powershell将其应用于sql server 2012数据库。

使用“4”参数调用“Deploy”的异常:“无法确定域的身份。” 在... so.ps1:17 char:8 + $ d.Deploy($ dp,$ TargetDatabase,$ true,$ DeployOptions)

编辑后的脚本(记录和文字已更改)如下:

   [System.Reflection.Assembly]::LoadFrom("C:\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\Microsoft.SqlServer.Dac.dll") | Out-Null

   $d = new-object Microsoft.SqlServer.Dac.DacServices ("... Connection string ...")

   $TargetDatabase = "databasename"
   $fullDacPacPath = "c:\temp\...\databasename.dacpac"

   # Load dacpac from file & deploy to database named pubsnew
   $dp = [Microsoft.SqlServer.Dac.DacPackage]::Load($fullDacPacPath)
   $DeployOptions = new-object Microsoft.SqlServer.Dac.DacDeployOptions
   $DeployOptions.IncludeCompositeObjects = $true
   $DeployOptions.IgnoreFileSize = $false
   $DeployOptions.IgnoreFilegroupPlacement = $false
   $DeployOptions.IgnoreFileAndLogFilePath = $false     
   $DeployOptions.AllowIncompatiblePlatform = $true  

   $d.Deploy($dp, $TargetDatabase,$true,$DeployOptions) 

以下是一些支持信息:

  1. Dac框架版本是11.1
  2. 在命令行上运行时,脚本会抛出错误:
    即。 Powershell -File databaseupgrade.ps1
    但不是在Powershell集成脚本环境中运行时
  3. 类似的脚本可以在命令行中为其他dacpac工作。
  4. 对网络的研究可能表明它可能与达卡饼的大小有关。工作的那些都小于没有工作的那个,this link提到了一个1.3mb的数字,失败的dacpac的文件大小刚刚超过。如果有人可以确认这是问题,你还可以建议一个解决方案吗?

    更新 以下脚本表现出相同的行为即。适用于PS Ide而不是命令行。

    [Reflection.Assembly]::LoadWithPartialName("System.IO.IsolatedStorage")
    
    $f =   [System.IO.IsolatedStorage.IsolatedStorageFile]::GetMachineStoreForDomain();
    Write-Host($f.AvailableFreeSpace);
    

3 个答案:

答案 0 :(得分:6)

我相信这个问题(至少在我们的例子中)实际上是当dacpac正在使用一个利用多个文件组的数据库时。在进行部署比较时,我的假设是它将IsolatedStorage用于不同的文件。

link above很有帮助,但它不是Tim Lewis上该博客上次评论的条目。我修改了他的代码以在原生PowerShell中工作。将此置于SMO装配负载之上应解决此问题:

$replacementEvidence = New-Object System.Security.Policy.Evidence $replacementEvidence.AddHost((New-Object System.Security.Policy.Zone ([Security.SecurityZone]::MyComputer))) $currentAppDomain = [System.Threading.Thread]::GetDomain() $securityIdentityField = $currentAppDomain.GetType().GetField("_SecurityIdentity", ([System.Reflection.BindingFlags]::Instance -bOr [System.Reflection.BindingFlags]::NonPublic)) $securityIdentityField.SetValue($currentAppDomain,$replacementEvidence)

答案 1 :(得分:0)

编辑 - 此答案不正确,请参阅原始问题中添加的链接,以获取有关真正根本原因的信息。

听起来您正在尝试连接Windows身份验证,这是导致失败的原因(请参阅this post,因为它似乎涵盖了您收到的错误消息)。更改您的连接字符串以使用SQL身份验证或确保您的powershell脚本正在运行的用户,因为它们都具有加入域的标识并具有访问服务器的权限。基本上,这是一个SQL连接问题而不是DAC问题。

答案 2 :(得分:0)

现在已经有几天了,所以我认为不会有正确的解释。我会发布这个作为我们解决方案的其他任何发现自己处于这种情况的人。 有一个很容易掌握的Microsoft命令行程序SqlPackage.exe。它将以静默方式部署dacpac,可以在Powershell中执行,并具有支持我们所需的所有选项的参数。 如果我们直接使用此代替Dac服务程序集,则不会出现域问题。