如何查询Azure ElasticDB池中的所有数据库?

时间:2017-02-16 04:01:11

标签: tsql azure

如何在ElasticDB池中可用的所有数据库的表上执行SELECT。它们都具有相同的DB模式,并且它们是动态创建的。我已经探索了弹性数据库查询,但在中间迷路了。

  

Reporting across scaled-out cloud databases

它首先要求下载一个示例控制台应用程序,创建一个分片,然后运行有点令人困惑的查询。无论如何,我可以从SQL Server Management Studio运行T-SQL查询来查询所有数据库。

PS:数据库没有分片。他们是每个客户的数据库。

提前致谢!

1 个答案:

答案 0 :(得分:0)

我认为您需要将数据库添加为外部源,以便您可以执行跨数据库查询,您将能够像查询本地一样查询表。 我找到了一个可以帮助你进行设置的指南: 链接指南:

  

https://www.mssqltips.com/sqlservertip/4550/sql-azure-cross-database-querying/

指南:

  

DB1有Db1Table表:

CREATE TABLE DB1.dbo.Db1Table (
ID int IDENTITY(1, 1) NOT NULL PRIMARY KEY,
CustomerId INT,
CustomerName NVARCHAR(50));
INSERT INTO DB1.dbo.Db1Table(CustomerId, CustomerName) VALUES 
( 1, 'aaaaaaa' ),
( 2, 'bbbbbbb' ),
( 3, 'ccccccc' ),
( 4, 'ddddddd' ),
( 5, 'eeeeeee' );
CREATE TABLE DB1.dbo.Db1Table (
ID int IDENTITY(1, 1) NOT NULL PRIMARY KEY,
CustomerId INT,
CustomerName NVARCHAR(50));
INSERT INTO DB1.dbo.Db1Table(CustomerId, CustomerName) VALUES 
( 1, 'aaaaaaa' ),
( 2, 'bbbbbbb' ),
( 3, 'ccccccc' ),
( 4, 'ddddddd' ),
( 5, 'eeeeeee' );
  

DB2有Db2Table表:

CREATE TABLE DB2.dbo.Db2Table (
ID int IDENTITY(1, 1) NOT NULL PRIMARY KEY,
CustomerId INT,
Country NVARCHAR(50));
INSERT INTO DB2.dbo.Db2Table(CustomerId, Country) VALUES 
( 1, 'United States' ),
( 3, 'Greece' ),
( 4, 'France' ),
( 5, 'Germany' ),
( 6, 'Ireland' );
CREATE TABLE DB2.dbo.Db2Table (
ID int IDENTITY(1, 1) NOT NULL PRIMARY KEY,
CustomerId INT,
Country NVARCHAR(50));
INSERT INTO DB2.dbo.Db2Table(CustomerId, Country) VALUES 
( 1, 'United States' ),
( 3, 'Greece' ),
( 4, 'France' ),
( 5, 'Germany' ),
( 6, 'Ireland' );
  

如果我们想要获取其国家/地区为希腊的客户,那么我们可以执行以下查询:

SELECT
db1.CustomerId,
db1.CustomerName
FROM DB1.dbo.Db1Table db1
INNER JOIN DB2.dbo.Db2Table db2 ON db1.CustomerId = db2.CustomerId
WHERE db2.Country = 'Greece';
SELECT
db1.CustomerId,
db1.CustomerName
FROM DB1.dbo.Db1Table db1
INNER JOIN DB2.dbo.Db2Table db2 ON db1.CustomerId = db2.CustomerId
WHERE db2.Country = 'Greece';
  

但是我们没有返回customerId 3,而是收到以下错误:

     

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

     

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

     

为了能够执行跨数据库查询,我们需要执行以下步骤:   第1步:创建主密钥

     

数据库主密钥是一个对称密钥,用于保护数据库中存在的证书和非对称密钥的私钥。更多信息在这里。

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';

-- Example --
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '3wbASg68un@q'
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';


-- Example --
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '3wbASg68un@q'
  

第2步:创建数据库范围凭据“my_credential”

     

数据库凭据未映射到服务器登录或数据库用户。只要数据库执行需要访问的操作,数据库就会使用凭证来访问外部位置。

CREATE DATABASE SCOPED CREDENTIAL <credential_name>
WITH IDENTITY = '<user>',
SECRET = '<secret>';

-- Example --
CREATE DATABASE SCOPED CREDENTIAL my_credential
WITH IDENTITY = 'dbuser',
SECRET = '9Pfwbg68un@q';


CREATE DATABASE SCOPED CREDENTIAL <credential_name>
WITH IDENTITY = '<user>',
SECRET = '<secret>';


-- Example --
CREATE DATABASE SCOPED CREDENTIAL my_credential
WITH IDENTITY = 'dbuser',
SECRET = '9Pfwbg68un@q';
  

credential_name   指定要创建的数据库作用域凭据的名称。 credential_name不能以数字(#)开头。系统凭据以##开头。       IDENTITY ='identity_name'       指定在服务器外部连接时要使用的帐户的名称。       SECRET ='秘密'       指定传出身份验证所需的密码。

     

步骤3:创建RDBMS类型的外部数据源“my_datasource”

     

此指令创建用于弹性数据库查询的外部数据源。对于RDBMS,它指定Azure SQL数据库中远程数据库的逻辑服务器名称。    - (仅限Azure SQL数据库v12或更高版本)

CREATE EXTERNAL DATA SOURCE <data_source_name>
WITH (
TYPE=RDBMS,
LOCATION='<server_name>.database.secure.windows.net',
DATABASE_NAME='<remote_database_name>',
CREDENTIAL = <sql_credential>);

-- Example --
CREATE EXTERNAL DATA SOURCE my_datasource
WITH (
TYPE=RDBMS,
LOCATION='ppolsql.database.secure.windows.net',
DATABASE_NAME='DB2',
CREDENTIAL = my_credential);

-- (only on Azure SQL Database v12 or later)

CREATE EXTERNAL DATA SOURCE <data_source_name>
WITH (
TYPE=RDBMS,
LOCATION='<server_name>.database.secure.windows.net',
DATABASE_NAME='<remote_database_name>',
CREDENTIAL = <sql_credential>);

-- Example --
CREATE EXTERNAL DATA SOURCE my_datasource
WITH (
TYPE=RDBMS,
LOCATION='ppolsql.database.secure.windows.net',
DATABASE_NAME='DB2',
CREDENTIAL = my_credential);
  

data_source_name       指定数据源的用户定义名称。该名称在Azure SQL数据库中的数据库中必须是唯一的。       TYPE = [HADOOP | SHARD_MAP_MANAGER | RDBMS]       将RDBMS与外部数据源一起使用,以便在Azure SQL数据库上使用弹性数据库查询进行跨数据库查询。       LOCATION =       指定Azure SQL数据库中远程数据库的逻辑服务器名称。       DATABASE_NAME ='remote_database_name'       远程数据库的名称(用于RDBMS)。       CREDENTIAL = credential_name       指定用于对外部数据源进行身份验证的数据库范围的凭据。

     

步骤4:创建外部表“mytable”

     

该指令为弹性数据库查询创建外部表。

CREATE EXTERNAL TABLE [ database_name . [ schema_name ] . | schema_name. ] table_name   
( <column_definition> [ ,...n ] )  
WITH (   
    DATA_SOURCE = <data_source_name>);

-- Example --
CREATE EXTERNAL TABLE [dbo].[Db2Table] (
[ID] int NOT NULL,
[CustomerId] INT,
[Country] NVARCHAR(50)
) WITH ( DATA_SOURCE = my_datasource )


CREATE EXTERNAL TABLE [ database_name . [ schema_name ] . | schema_name. ] table_name   
( <column_definition> [ ,...n ] )  
WITH (   
    DATA_SOURCE = <data_source_name>
);

-- Example --
CREATE EXTERNAL TABLE [dbo].[Db2Table] (
[ID] int NOT NULL,
[CustomerId] INT,
[Country] NVARCHAR(50)
) WITH ( DATA_SOURCE = my_datasource )
  

database_name。 [schema_name]。 |模式名。 ] table_name       要创建的表的一到三部分名称。对于外部表,只有表元数据存储在SQL中,以及有关Hadoop或Azure blob存储中引用的文件和/或文件夹的基本统计信息。没有实际数据在SQL Server中移动或存储。        [,...... n]       列定义(包括数据类型和列数)必须与外部文件中的数据匹配。       DATA_SOURCE = external_data_source_name       指定包含外部数据位置的外部数据源的名称。

     

运行DDL语句后,您可以像访问本地表一样访问远程表Db2Table。

     

所以,现在,如果我们想要获取其国家/地区为希腊的客户,则查询将成功执行:

SELECT
db1.CustomerId,
db1.CustomerName
FROM DB1.dbo.Db1Table db1
INNER JOIN DB1.dbo.Db2Table db2 ON db1.CustomerId = db2.CustomerId
WHERE db2.Country = 'Greece';

-- Result --
CustomerId | CustomerName
-------------------------
3        ccccccc


SELECT
db1.CustomerId,
db1.CustomerName
FROM DB1.dbo.Db1Table db1
INNER JOIN DB1.dbo.Db2Table db2 ON db1.CustomerId = db2.CustomerId
WHERE db2.Country = 'Greece';


-- Result --
CustomerId | CustomerName
-------------------------
3        ccccccc