0

我正在开发一个项目,该项目旨在使用 Azure 数据库在 azure 平台上运行,并在本地使用本地 sql 服务器。我们有包含跨数据库调用的存储过程。但是它不适用于 Azure 服务器。我需要能够在 azure 和本地 sql 服务器中工作的跨数据库查询。

我们使用 Elastic Query,它允许我们跨 Azure SQL 数据库进行查询

https://azure.microsoft.com/en-us/documentation/articles/sql-database-elastic-query-overview/

我们可以使用以下代码在 azure 服务器中设置外部数据源。在这种情况下,我们可以执行跨数据库调用,例如连接单个数据库中的表。

 CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'yourPassword';  

 CREATE DATABASE SCOPED CREDENTIAL yourServeradminlogin  
 WITH IDENTITY = 'yourServeradminlogin',  
 SECRET = 'yourPassword';  

 CREATE EXTERNAL DATA SOURCE RefmyDemoDB2  
 WITH  
 (  
    TYPE=RDBMS,  
    LOCATION='testdbdemoserver.database.windows.net',  
    DATABASE_NAME='myDemoDB2',  
    CREDENTIAL= yourServeradminlogin  
 );  

 CREATE EXTERNAL TABLE [dbo].[Department](  
    [DeptId] [int] NOT NULL,  
    [Name] [varchar](50) NULL  
 )  
 WITH  
 (  
    DATA_SOURCE = RefmyDemoDB2  
 );  

如果不添加第三方数据库引擎,似乎无法在我们的本地 SQL 服务器上使用上述方法。在本地 sql server 2017 及更高版本中安装一个名为 PolyBase 的东西来进行跨数据库查询。它仅支持 HADOOP 等外部数据源类型,而不是在 sql server 中引用另一个数据库(或任何数据存储)。

我们可以使用以下代码来完成

  CREATE MASTER KEY ENCRYPTION BY PASSWORD='MyP@ssword123secretword';

  CREATE DATABASE SCOPED CREDENTIAL mycredential  
  WITH IDENTITY = 'credential', Secret = 'secretkey' 

  CREATE EXTERNAL DATA SOURCE mycustomers
  WITH (
    TYPE = HADOOP,
    LOCATION =  'wasbs://azurestorage.blob.core.windows.net/',
    CREDENTIAL = mycredential
  );

  CREATE EXTERNAL FILE FORMAT csvformat 
  WITH ( 
    FORMAT_TYPE = DELIMITEDTEXT, 
    FORMAT_OPTIONS ( 
      FIELD_TERMINATOR = ','
    ) 
  );

  CREATE EXTERNAL TABLE TableName
  ( 
    [did] [int] NOT NULL,  
    [Dname] [varchar] (50) NULL 
  ) 
  WITH 
  ( 
     LOCATION = '/', 
     DATA_SOURCE = mycustomers, 
     FILE_FORMAT = csvformat
  )

使用 HADOOP 和 polybase,我们可以在本地 sql server 中创建外部数据源。但它创建了该外部数据存储的外部数据源。即位于该外部存储中的外部数据表。确切地说,我的要求是在 sql server 中创建数据库的外部数据源。这样我就可以在 azure 和本地 sql server 中使用相同的 corss 数据库查询

有没有办法解决这个问题。或者在 azure 和本地 sql server 中运行跨数据库查询的任何解决方案?

4

1 回答 1

3

您不应假定在 SQL Azure 中使用外部表与在 SQL Server 中执行跨数据库查询非常相似。它们不是一回事,它们的性能特征也大不相同。与 SQL Server 中的跨数据库查询相比,外部表更接近链接服务器。

在 SQL Server 中,跨数据库查询是: - 在同一个 SQL 实例中运行 - 运行相同的基本执行代码路径来读取数据与单数据库 SQL Azure - 与单数据库操作相比,事务语义略有不同SQL Server,但从您的角度来看,体验通常是相似的。

在 SQL Azure 单例(“传统”)SQL Azure 中,您通常不会在同一物理机器上拥有数据库。因此,您必须跨服务器查询(这些查询使用类似于链接服务器的机制公开,称为外部表,主要支持分片/扇出方案)。尝试使用此功能来模拟跨数据库查询可能在功能上可行,但由于性能差异,这并不是一个很好的计划。在这条路径中也根本没有真正的交易保证(没有 DTC)。

SQL Azure 托管实例内部支持单个 SQL Server 实例中的跨数据库查询。因此,如果您真的想使用跨数据库查询,这将是您使用的最相似的路径。如果要使用 SQL Azure 单一数据库,通常根本不想对遗留工作负载执行跨数据库查询,并且需要重写以避免依赖。(否则,由于性能差异,这将只是一个持续的头痛)

于 2019-03-27T20:20:22.133 回答