sql - 将 Azure bacpac 文件导入本地数据库时出错 EXTERNAL 附近的语法错误

标签 sql azure import bacpac

将 db 从 azure bacpac 文件导入到本地 sql server 2016 时,出现以下错误。

Error SQL72014: .Net SqlClient Data Provider: Msg 102, Level 15, State 1, Line 1 Incorrect syntax near 'EXTERNAL'.
Error SQL72045: Script execution error.  The executed script: CREATE EXTERNAL DATA SOURCE [BoxDataSrc]
    WITH (
    TYPE = RDBMS,
    LOCATION = N'MYAZUREServer.database.windows.net',
    DATABASE_NAME = N'MyAzureDb',
    CREDENTIAL = [SQL_Credential]
    );

(Microsoft.SqlServer.Dac)

最佳答案

我今天也遇到了同样的问题。由于“WITH(TYPE = RDBMS)”仅适用于 Azure SQL DB,因此我们在尝试将 bacpac 导入本地 SQL Server 2017 时收到错误。感谢这篇文章,我确实找到了解决方案:

https://blogs.msdn.microsoft.com/azuresqldbsupport/2017/08/16/editing-a-bacpac-file/

相关步骤重写如下:

  1. 制作 bacpac 文件的副本(为了安全起见,以防出现错误)。

  2. 将文件扩展名更改为 zip,然后将其解压到文件夹中。令人惊讶的是,bacpac 实际上只是一个 zip 文件,而不是专有的且难以进入的文件。

  3. 找到 model.xml 文件并对其进行编辑以删除如下所示的部分:

    <Element Type="SqlExternalDataSource" Name="[BoxDataSrc]">
        <Property Name="DataSourceType" Value="1" />
        <Property Name="Location" Value="MYAZUREServer.database.windows.net" />
        <Property Name="DatabaseName" Value="MyAzureDb" />
        <Relationship Name="Credential">
            <Entry>
                <References Name="[SQL_Credential]" />
            </Entry>
        </Relationship>
    </Element>
    
  4. 如果您有多个此类外部数据源,您可能需要为每个数据源重复步骤 3。我只有一个。

  5. 保存并关闭 model.xml。

  6. 现在您需要重新生成 model.xml 的校验和,以便 bacpac 不会认为它被篡改(因为您刚刚篡改了它)。创建一个名为computeHash.ps1 的PowerShell 文件并将此代码放入其中。

    $modelXmlPath = Read-Host "model.xml file path"
    Get-FileHash -Path $modelXmlPath -Algorithm 'SHA256' | Select-Object -ExpandProperty Hash
    
  7. 运行 PowerShell 脚本并为其提供解压并编辑的 model.xml 文件的文件路径。它将返回一个校验和值。

  8. 复制校验和值,然后打开 Origin.xml 并替换现有的校验和,如下所示:

    <Checksum Uri="/model.xml">9EA0F06B282D4F42955C78A98822A31AA0ED0225CB131B8759379055A482D01F</Checksum>
    
  9. 保存并关闭 Origin.xml,然后选择所有文件并将它们放入新的 zip 文件中,并将扩展名重命名为 bacpac。

现在您可以使用这个新的 bacpac 导入数据库而不会出现错误。它对我有用,也对你有用。

关于sql - 将 Azure bacpac 文件导入本地数据库时出错 EXTERNAL 附近的语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42028861/

相关文章:

c++ - SOCI(SQL C++ 包装器)- PostgreSQL 不执行命令(?)

sql - 在数据库中留下约束错误有什么危险?

azure - Service Fabric 生产托管

node.js - 尝试将 Vue 应用程序部署到 Azure 应用程序服务,导致错误 : Cannot find module '../package.json'

python - 无法从 python 2.7 中的 x 导入名称

sql - 如何获取MySQL对象:Connector cursor with python

SQL:将对象插入表时随机排序

json - Invoke-WebRequest\RestMethod mangle 带有转义的 json 字符串

python - 从 python 调用 python - 模块导入的持久性?

python - 导入错误:无法导入名称 _aligners [biopython]