【问题标题】:Publish to SQL Azure fails with 'Cannot drop the external data source' message发布到 SQL Azure 失败并显示“无法删除外部数据源”消息
【发布时间】:2021-02-04 05:16:28
【问题描述】:

我的解决方案中有一个 SQL 项目 (.sqlproj),目标平台为“Microsoft Azure SQL 数据库 V12”。

最近我添加了一个external data source 和几个external tables 针对这个数据源。

ExternalCSVLists.sql 文件:

CREATE EXTERNAL DATA SOURCE [ExternalCSVLists] WITH
(  
    TYPE = RDBMS,
    LOCATION = 'location.windows.net',
    DATABASE_NAME = '$(CSVLists)',
    CREDENTIAL = RemoteConnectionCredential
)

外部表示例(IntegerListContent.sql文件)

CREATE EXTERNAL TABLE [WebApp].[IntegerListContent] 
(  
     [ListId] INT,
     [Value] int 
)
WITH  
(  
    DATA_SOURCE = [ExternalCSVLists]
) 

第一次发布成功。

现在,当我再次发布时(没有对外部表或数据源进行 任何 更改),我收到以下错误:

正在删除 [ExternalCSVLists]... (415,1): SQL72014: .Net SqlClient 数据提供者: Msg 33165, Level 16, State 1, Line 1 无法删除外部数据源“ExternalCSVLists”,因为它被外部表使用。

我检查了发布脚本并注意到它试图删除并创建外部数据源。外部表被跳过(这可能没问题,因为我没有更改它们)。

所以,

1) 当所有此类数据源与已发布的数据源相同时,为什么它会产生 drop external data source 语句

2) 那么为什么会忽略依赖的external tables呢?

我的发布设置几乎是默认设置(“删除”选项卡中的选项均未选中)。谢谢!

【问题讨论】:

    标签: sql-server azure azure-sql-database sqlproj


    【解决方案1】:

    我遇到了同样的问题;不幸的是,我无法弄清楚为什么会首先出现这个问题。

    但解决方法是引入一个预部署步骤,删除所有

    • 表格和
    • 观看次数

    这引用了外部数据源...我原以为 DACPAC 会自行执行此操作;但我想我们生活在一个不完美的世界里。

    【讨论】:

      【解决方案2】:

      我调整了上述方法,并将其置于我的 DevOps 发布管道中:

      1. 使用 Azure SQL 数据库部署任务运行 SQL 脚本以删除目标数据库中的所有外部对象。这可以防止在普通部署中发生的“无法删除对象”错误。
      declare @sql as nvarchar(max) 
      ; with cmds as (
      select 
          CONCAT('drop external table ' ,QUOTENAME(OBJECT_SCHEMA_NAME(t.object_id)) , '.' , QUOTENAME(OBJECT_NAME(t.object_id))) as Cmd
      from sys.external_tables t
      union all 
      select 
          'drop external data source ' + QUOTENAME(s.name)
      from sys.external_data_sources s
      ) 
      select @sql= STRING_AGG(cmd,';')
      from cmds 
      print @sql
      
      if(len(@sql) > 0)
      begin
      exec sp_executesql @sql
      end
      
      1. 使用 Azure SQL 数据库部署任务使用 publish.xml 配置文件执行数据库部署,该配置文件忽略除外部对象之外的所有对象类型。这将重新创建在上一步中删除的所有对象,但具有正确的定义。
      <?xml version="1.0" encoding="utf-8"?>
      <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <PropertyGroup>
          <IncludeCompositeObjects>True</IncludeCompositeObjects>
          <TargetDatabaseName></TargetDatabaseName>
          <DeployScriptFileName></DeployScriptFileName>
          <BlockOnPossibleDataLoss>False</BlockOnPossibleDataLoss>
          <GenerateSmartDefaults>True</GenerateSmartDefaults>
          <DropObjectsNotInSource>True</DropObjectsNotInSource>
          <DoNotDropPermissions>True</DoNotDropPermissions>
          <DoNotDropRoleMembership>True</DoNotDropRoleMembership>
          <DoNotDropUsers>True</DoNotDropUsers>
          <IgnoreColumnOrder>True</IgnoreColumnOrder>
          <ProfileVersionNumber>1</ProfileVersionNumber>
          <ExcludeAggregates>True</ExcludeAggregates>
          <ExcludeApplicationRoles>True</ExcludeApplicationRoles>
          <ExcludeAssemblies>True</ExcludeAssemblies>
          <ExcludeAsymmetricKeys>True</ExcludeAsymmetricKeys>
          <ExcludeAudits>True</ExcludeAudits>
          <ExcludeBrokerPriorities>True</ExcludeBrokerPriorities>
          <ExcludeCertificates>True</ExcludeCertificates>
          <ExcludeClrUserDefinedTypes>True</ExcludeClrUserDefinedTypes>
          <ExcludeColumnEncryptionKeys>True</ExcludeColumnEncryptionKeys>
          <ExcludeColumnMasterKeys>True</ExcludeColumnMasterKeys>
          <ExcludeContracts>True</ExcludeContracts>
          <ExcludeCryptographicProviders>True</ExcludeCryptographicProviders>
          <ExcludeDatabaseAuditSpecifications>True</ExcludeDatabaseAuditSpecifications>
          <ExcludeDatabaseRoles>True</ExcludeDatabaseRoles>
          <ExcludeDatabaseTriggers>True</ExcludeDatabaseTriggers>
          <ExcludeDefaults>True</ExcludeDefaults>
          <ExcludeEndpoints>True</ExcludeEndpoints>
          <ExcludeErrorMessages>True</ExcludeErrorMessages>
          <ExcludeEventNotifications>True</ExcludeEventNotifications>
          <ExcludeEventSessions>True</ExcludeEventSessions>
          <IgnoreExtendedProperties>True</IgnoreExtendedProperties>
          <ExcludeExternalDataSources>False</ExcludeExternalDataSources>
          <ExcludeFileTables>True</ExcludeFileTables>
          <ExcludeFilegroups>True</ExcludeFilegroups>
          <ExcludeFullTextCatalogs>True</ExcludeFullTextCatalogs>
          <ExcludeFullTextStoplists>True</ExcludeFullTextStoplists>
          <ExcludeLinkedServerLogins>True</ExcludeLinkedServerLogins>
          <ExcludeLinkedServers>True</ExcludeLinkedServers>
          <ExcludeLogins>True</ExcludeLogins>
          <ExcludePartitionFunctions>True</ExcludePartitionFunctions>
          <ExcludeMessageTypes>True</ExcludeMessageTypes>
          <ExcludePartitionSchemes>True</ExcludePartitionSchemes>
          <IgnorePermissions>True</IgnorePermissions>
          <ExcludeQueues>True</ExcludeQueues>
          <ExcludeRemoteServiceBindings>True</ExcludeRemoteServiceBindings>
          <IgnoreRoleMembership>True</IgnoreRoleMembership>
          <ExcludeRoutes>True</ExcludeRoutes>
          <ExcludeRules>True</ExcludeRules>
          <ExcludeScalarValuedFunctions>True</ExcludeScalarValuedFunctions>
          <ExcludeSearchPropertyLists>True</ExcludeSearchPropertyLists>
          <ExcludeSecurityPolicies>True</ExcludeSecurityPolicies>
          <ExcludeSequences>True</ExcludeSequences>
          <ExcludeServerAuditSpecifications>True</ExcludeServerAuditSpecifications>
          <ExcludeServerRoleMembership>True</ExcludeServerRoleMembership>
          <ExcludeServerRoles>True</ExcludeServerRoles>
          <ExcludeServerTriggers>True</ExcludeServerTriggers>
          <ExcludeServices>True</ExcludeServices>
          <ExcludeSignatures>True</ExcludeSignatures>
          <ExcludeStoredProcedures>True</ExcludeStoredProcedures>
          <ExcludeSymmetricKeys>True</ExcludeSymmetricKeys>
          <ExcludeSynonyms>True</ExcludeSynonyms>
          <ExcludeTableValuedFunctions>True</ExcludeTableValuedFunctions>
          <ExcludeTables>True</ExcludeTables>
          <ExcludeUserDefinedDataTypes>True</ExcludeUserDefinedDataTypes>
          <ExcludeUserDefinedTableTypes>True</ExcludeUserDefinedTableTypes>
          <ExcludeUsers>True</ExcludeUsers>
          <ExcludeViews>True</ExcludeViews>
          <ExcludeXmlSchemaCollections>True</ExcludeXmlSchemaCollections>
          <ExcludeCredentials>True</ExcludeCredentials>
        </PropertyGroup>
      </Project>
      
      1. 使用另一个 Azure SQL 数据库部署任务,使用忽略所有外部对象类型的 publish.xml 配置文件进行数据库部署。
      <?xml version="1.0" encoding="utf-8"?>
      <Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
        <PropertyGroup>
          <IncludeCompositeObjects>True</IncludeCompositeObjects>
          <TargetDatabaseName></TargetDatabaseName>
          <DeployScriptFileName></DeployScriptFileName>
          <BlockOnPossibleDataLoss>False</BlockOnPossibleDataLoss>
          <GenerateSmartDefaults>True</GenerateSmartDefaults>
          <DropObjectsNotInSource>True</DropObjectsNotInSource>
          <DoNotDropPermissions>True</DoNotDropPermissions>
          <DoNotDropRoleMembership>True</DoNotDropRoleMembership>
          <DoNotDropUsers>True</DoNotDropUsers>
          <IgnoreColumnOrder>True</IgnoreColumnOrder>
          <ProfileVersionNumber>1</ProfileVersionNumber>
          <ExcludeCredentials>True</ExcludeCredentials>
          <ExcludeDatabaseScopedCredentials>True</ExcludeDatabaseScopedCredentials>
          <ExcludeExternalTables>True</ExcludeExternalTables>
          <ExcludeExternalFileFormats>True</ExcludeExternalFileFormats>
          <ExcludeExternalDataSources>True</ExcludeExternalDataSources>
        </PropertyGroup>
      </Project>
      

      【讨论】:

      • 感谢您的解决方法。我试图找到如何声明一个项目的依赖关系,但这似乎不是一个可用的功能,这很奇怪,因为确实有一些东西需要按顺序创建。我想我们还需要为新建部署创建数据库范围凭据,对吗?
      【解决方案3】:

      我也有这个问题。作为一种解决方法,您还可以使用:/p:DoNotDropObjectTypes=ExternalDataSources

      但它只有在您的外部数据源没有变化时才有效。

      我打开了一个反馈case on microsoft。如果您愿意,可以支持此案。

      【讨论】:

        猜你喜欢
        • 2018-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-22
        • 1970-01-01
        • 1970-01-01
        • 2019-04-25
        相关资源
        最近更新 更多