我正在研究一个项目,该项目旨在使用Azure数据库和在本地使用本地sql服务器在azure平台上运行。我们已经存储了包含跨数据库调用的过程。但是,它在Azure服务器上不起作用。我需要能够在azure和本地sql服务器上都可以使用的跨数据库查询。
我们使用弹性查询,该查询使我们可以跨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服务器中引用另一个数据库(或任何数据存储)。
我们可以使用以下代码完成
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服务器中创建一个外部数据源。但是它创建该外部数据存储的外部数据源。那就是位于外部存储中的外部数据表。确实,我的要求是在sql服务器中创建数据库的外部数据源。这样我就可以在azure和本地sql服务器中使用相同的corss数据库查询
有什么解决方案可以解决此问题。还是在Azure和本地sql服务器中运行跨数据库查询的任何解决方案?
答案 0 :(得分:0)
您不应假定在SQL Azure中使用外部表与在SQL Server中进行跨数据库查询在远程上相似。它们不是同一件事,它们具有非常不同的性能配置文件。外部表比SQL Server中的跨数据库查询更靠近链接服务器。
在SQL Server中,跨数据库查询为: -在同一个SQL实例中运行 -与单个数据库SQL Azure运行相同的基本执行代码路径以读取数据 -与SQL Server中的单数据库操作相比,您在事务语义上有一些不同,但是从您的角度来看,体验通常是相似的。
在SQL Azure单例(“传统”)SQL Azure中,通常在同一物理计算机上没有数据库。因此,您必须进行跨服务器查询(使用链接服务器之类的称为外部表的机制公开该查询,该机制主要支持分片/扇出场景)。尝试使用此功能来模拟跨数据库查询可能在功能上可行,但是由于性能差异,这并不是一个很好的计划。这条路径上也没有任何真正的交易保证(没有DTC)。
SQL Azure托管实例确实在内部支持单个SQL Server实例中的跨数据库查询。因此,如果您确实想使用跨数据库查询,那么这将是您使用的最相似的路径。如果要使用SQL Azure单个数据库,通常通常根本不想为旧版工作负载执行跨数据库查询,并且需要重写以避免依赖。 (否则,由于性能差异,这将一直令人头疼)