8

有没有其他人遇到过与下面描述的类似的问题?

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

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

使用“4”参数调用“部署”的异常:“无法确定域的身份。” 在 ... 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. 其他 dacpacs 的命令行也可以使用类似的脚本。

网络研究可能表明这可能与 dacpac 的大小有关。工作的都比不工作的小,这个链接提到了一个 1.3mb 的数字,失败的 dacpac 的文件大小刚刚超过。如果有人可以确认这是问题所在,您还可以提出解决方案吗?

更新 以下脚本表现出相同的行为,即。在 PS Ide 中工作而不是从命令行。

[Reflection.Assembly]::LoadWithPartialName("System.IO.IsolatedStorage")

$f =   [System.IO.IsolatedStorage.IsolatedStorageFile]::GetMachineStoreForDomain();
Write-Host($f.AvailableFreeSpace);
4

3 回答 3

7

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

上面的链接很有帮助,但它不像蒂姆·刘易斯在该博客上的最后评论那样多。我修改了他的代码以在本机 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)

于 2015-08-28T22:38:17.387 回答
0

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

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

于 2014-01-09T21:51:28.653 回答
0

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

于 2014-01-16T09:17:31.010 回答