如何在ElasticDB池中可用的所有数据库的表上执行SELECT。它们都具有相同的DB模式,并且它们是动态创建的。我已经探索了弹性数据库查询,但在中间迷路了。
它首先要求下载一个示例控制台应用程序,创建一个分片,然后运行有点令人困惑的查询。无论如何,我可以从SQL Server Management Studio运行T-SQL查询来查询所有数据库。
PS:数据库没有分片。他们是每个客户的数据库。
提前致谢!
答案 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