【问题标题】:Not able to do cross database query in SQL Azure无法在 SQL Azure 中进行跨数据库查询
【发布时间】:2017-08-16 14:00:55
【问题描述】:

我在同一个 SQL Azure 服务器上有 2 个 DB,并且我在两个 DB 上有相同的表 (TB1),现在我想从 DB2 的 TB1 读取数据并将数据插入 DB1 的 TB1。 我正在使用以下查询,但出现错误。

insert into TB1 select 1,* from [DB2].dbo.TB1

错误信息

消息 40515,第 15 级,状态 1,第 16 行

此版本的 SQL Server 不支持对“DB2.dbo.TB1”中的数据库和/或服务器名称的引用。

【问题讨论】:

  • azure sql 不支持跨数据库查询,试试弹性查询
  • 使用 Azure 数据工厂在 Azure 中将数据从一个地方移动到另一个地方。

标签: azure-sql-database


【解决方案1】:

是的,您可以使用 SQL Azure 上的弹性查询功能。这是执行跨数据库查询的唯一方法。

下面是详细的查询:

在您的 DB1 中运行以下查询(因为您说喜欢从 DB2 读取 TB1 并将这些数据插入 DB1 中的 TB2)

CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'STro*ngPaSSe0rD';

CREATE DATABASE SCOPED CREDENTIAL Login
WITH IDENTITY = 'Login',
SECRET = 'STro*ngPaSSe0rD';

CREATE EXTERNAL DATA SOURCE RemoteReferenceData
WITH
(
    TYPE=RDBMS,
    LOCATION='myserver.database.windows.net',
    DATABASE_NAME='DB2',
    CREDENTIAL= Login
);




CREATE EXTERNAL TABLE [dbo].[TB1]
(
    [Columns] [DataTypes] 
)
WITH (DATA_SOURCE = [RemoteReferenceData])

完成这些步骤后,您可以像普通表一样查询外部表。尽管在使用 外部表 时存在一些限制,例如您无法将数据插入EXTERNAL TABLE(Reference table)

【讨论】:

  • 尝试这样做...在 Azure sql 上,它似乎不喜欢这种语法。许多错误,首先是“'IDENTITY'附近的语法不正确”
  • these情况下呢?
  • 如果我有相同的用户名/密码,我可以直接从 Azure 上的 DbName2 中的 [DbName].dbo.TableName 中选择。也许他们最近添加了这个能力?
  • @Ryan 我不确定这个功能。但我敢肯定,以前这是不可能的。您使用的是哪个版本的 SSMS?
  • 17.9.1 今天在同一个 SQL 服务器中工作。我不确定它是否适用于 azure 中的 sql 服务器。我认为可能,但我从同事那里听说它在 azure sql 和 azure 之外的传统 sql server 之间不起作用。
【解决方案2】:

Azure 支持这种跨数据库查询功能 since 2015,但需要一些 extra setup 才能工作和弹性查询。

第一步是创建安全凭证:

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
CREATE DATABASE SCOPED CREDENTIAL DB2Security 
WITH IDENTITY = '<username>',
SECRET = '<password>';

“用户名”和“密码”应该是用于登录 DB2 数据库的用户名和密码。

现在您可以使用它来定义外部数据源,以便 DB1 可以连接到 DB2:

CREATE EXTERNAL DATA SOURCE DB2Access
WITH (
    TYPE=RDBMS,
    LOCATION='myservernotyours.database.secure.windows.net',
    DATABASE_NAME='DB2',
    CREDENTIAL= DB2Security);

最后,您使用之前的外部数据源将 TB1 映射为 DB2 数据库的外部表:

CREATE EXTERNAL TABLE dbo.TB1FromDB2(
    ID int,
    Val varchar(50))
WITH
(
    DATA_SOURCE = DB2Access);

您也可以使用Azure SQL Data Sync 完成此操作,但数据会复制到一个数据库中,并且此功能仍是预览版(2018 年 5 月),您始终会看到最旧的数据(每次同步的最小可配置间隔是 5 分钟)。

【讨论】:

  • 我需要为 DB2 中的每个表创建外部表吗?
  • 我需要删除外部数据源吗?
  • 是的,需要为 DB2 中的每个表创建外部表
【解决方案3】:

您可以使用 SQL Azure 上的弹性查询功能执行跨数据库查询。

您必须创建一个外部数据源和一个外部表才能查询其他 SQL Azure 数据库上的表。 This 文章展示了如何做到这一点。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2021-12-05
    • 2012-07-02
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多