【问题标题】:Running SQL Server database locally when using Azure-specific functionality?使用 Azure 特定功能时在本地运行 SQL Server 数据库?
【发布时间】:2019-05-15 16:06:07
【问题描述】:

我正在考虑将使用本地 SQL Server 的项目迁移到 SQL Azure。数据库具有跨数据库依赖关系,其中某些视图引用同一服务器上的另一个数据库,SQL Azure 不支持。

我已成功修改这些以使用使用外部数据源的外部表,该外部数据源是通过以下方式创建的:

CREATE EXTERNAL DATA SOURCE [MyExternalDataSource] WITH
(
    TYPE = RDBMS,
    LOCATION = 'SqlServerName',
    DATABASE_NAME = 'SqlServerDatabaseName',
    CREDENTIAL = cred
);

但是,此类数据源使用的 RDBMS 类型似乎仅受 SQL Azure 支持,本地 SQL Server 不支持。对前者运行此脚本可以正常工作,而后者会导致引发以下错误:

“RDBMS”附近的语法不正确

因此,这意味着解决方案中的数据库项目不能同时用于 Azure SQL 和本地 SQL Server 安装。

作为一种解决方法,我正在考虑以下选项,尽管每个选项都有其缺点:

  1. 解决方案中有多个数据库项目,一个针对 SQL Azure,另一个针对 SQL Server - 尽管这意味着将所有数据库更新复制到两个项目。

  2. 不再使用外部表,转而使用 Azure 提供的数据同步功能,并在两个数据库中复制表和数据(无需使用导致问题的外部数据源)——尽管这有至少延迟 5 分钟(在这种特定情况下可能可以接受,但肯定不适合所有人)

其他开发人员如何处理这种需要在您的项目中使用 SQL Azure 特定功能但您还需要能够运行数据库的本地副本以进行开发的场景?

【问题讨论】:

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


    【解决方案1】:

    您可以尝试创建 3 个项目:
    1. 项目仅包含定义为视图的 Azure 特定引用。
    2. 项目仅包含定义为视图的 SQL Server 特定引用。视图的结构应该相同。
    3. 你的主要项目。在这个项目中,您将引用以前的一个作为“复合项目”参考。
    https://docs.microsoft.com/en-us/sql/ssdt/add-database-reference-dialog-box?view=sql-server-2017

    【讨论】:

      【解决方案2】:

      这里概述了几种方法: Conditional logic in PostDeployment.sql script using SQLCMD

      在尝试了所有选项后,对我有用的是使用构建事件。

      使用此方法,我将项目设置为使用空脚本作为预部署脚本,然后在构建之前将其替换为正确的脚本(本地部署调试和 Azure 发布)。构建后,占位符脚本会被复制回它,以避免将更改的文件提交到源代码管理。

      这是文件夹结构:

      在项目文件中,我添加了以下 BeforeBuild 和 AfterBuild 目标:

      <Target Name="BeforeBuild">
          <Copy Condition=" '$(Configuration)' == 'Debug' " SourceFiles="Pre-Deployment\OnPremises.PreDeploymentScript.sql" DestinationFiles="Pre-Deployment\PreDeploymentScript.sql" OverwriteReadOnlyFiles="true" />
          <Copy Condition=" '$(Configuration)' == 'Release' " SourceFiles="Pre-Deployment\Azure.PreDeploymentScript.sql" DestinationFiles="Pre-Deployment\PreDeploymentScript.sql" OverwriteReadOnlyFiles="true" />
        </Target>
        <Target Name="AfterBuild">
          <Copy SourceFiles="Pre-Deployment\Empty.PreDeploymentScript.sql" DestinationFiles="Pre-Deployment\PreDeploymentScript.sql" OverwriteReadOnlyFiles="true" />
        </Target>
      

      Azure 预部署脚本创建外部数据源(在单独的脚本中,此处未显示)和外部表:

      IF (NOT EXISTS(SELECT * FROM sys.tables WHERE NAME = 'MyExternalTable' AND is_external = 1))
          BEGIN
              PRINT 'Creating external table: MyExternalTable'
      
              CREATE EXTERNAL TABLE [MySchema].[MyExternalTable](
                  [Id] [int],
                  [Name] [nvarchar](3000) NOT NULL
              )
              WITH
              (
                  DATA_SOURCE = [ExternalDataSourceName]
              );
      
              PRINT 'Created external table: MyExternalTable'
          END
      ELSE
          BEGIN
              PRINT 'External table ''MyExternalTable'' is already created'
          END
      GO
      

      虽然本地只是创建一些同义词:

      IF NOT EXISTS(SELECT * FROM sys.synonyms WHERE name = 'MyExternalTable')
      BEGIN
          CREATE SYNONYM [MySchema].[MyExternalTable] FOR [OtherDb].[OtherSchema].[OtherTable]
      END
      

      然后视图可以无缝地使用它,而不必知道它们是使用外部数据源从外部表中获取数据,还是使用同义词引用同一服务器上的另一个数据库:

      CREATE VIEW [dbo].[MyView] AS SELECT * FROM [Myschema].[MyTable]
      

      虽然感觉有点笨拙,但它似乎运行良好,并且允许使用单个数据库项目部署到 Azure 和本地(本地)SQL Server。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-05
        • 2018-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多