Cross-Database Query – AzureSQL Database

Cross-Database Query – AzureSQL Database

16 de abril de 2021 Off Por Oberdan Schaider e Rodrigo Crespi

Fala Pessoal! 

Atualmente em alguns cenários, nos deparamos com situações em que precisamos acessar e gerar informações a partir de várias fontes de dados.

Imagine a seguinte situação: em um servidor de SQL Server existem duas instâncias, onde você precisa realizar uma query da instância A para a instância B. Possivelmente pensará em utilizar um Linked Server para realizar o acesso.
Agora vamos pensar que na instância A, você precisa gerar informações através de uma query referente informações do banco de dados X e do banco Y. Nesse cenário, você DBA fica mais tranquilo, pois não existirá a camada de Linked Server para fazer a ponte entre as instâncias, só será necessário utilizar o formato de banco.schema.tabela. 

Assim: 
select Y.*, X.* from BancoY.dbo.person as Y  
inner join BancoX.[SalesLT].[Customer] as X on X.CustomerID = Y 

Agora imagine um cenário em cloud, especificamente em um serviço AzureSQL. É possível realizar esse tipo de conexão entre dois bancos de dados localizados na mesma instância? Sim, porém não é tão intuitivo quanto em um ambiente On-Premises

Então, vamos pensar no seguinte cenário: 
1 serviço de AzureSQL com 2 databases (BancoX e BancoY).
Através do BancoY vamos precisar acessar informações do BancoX.

No cenário On-Premises (como descrito inicialmente no post), conseguiríamos utilizar o script sem nenhum problema. 
Porém, utilizando a mesma query em um AzureSQL, ocorreria o seguinte erro: 
Msg 40515, Level 15, State 1, Line 25 
Reference to database and/or server name in ‘BancoX.SalesLT.Customer’ is not supported in this version of SQL Server. 

Então, “entra na jogada” as External Tables. 
Vamos precisar seguir alguns passos. São eles:

1- Criar login na origem e destino: 
CREATE LOGIN sqluser with password = ‘d’ 
CREATE USER sqluser for login sqluser 

2- Criar a Master Key para criptografar a credencial utilizada posteriormente: 
CREATE MASTER KEY ENCRYPTION BY PASSWORD = ‘1senhaforte.’ –rodar comando no banco destino (bancoY) 

3- Criar a credencial no banco destino (BancoY): 
CREATE DATABASE SCOPED CREDENTIAL ElasticDBQueryTeste  
WITH IDENTITY = ‘sqluser’, 
SECRET = ‘1senhaforte.’;

4- Verificar se as credenciais foram criadas com sucesso: 
select * from sys.database_scoped_credentials 
SELECT * from sys.symmetric_keys 

5-Criar um Data Source, referenciado ao servidor que deseja se conectar: 
CREATE EXTERNAL DATA SOURCE DS_ElasticDBQueryTeste WITH
(TYPE = RDBMS, 
LOCATION = ‘srvsqlcrespidb.database.windows.net’, 
DATABASE_NAME = ‘BancoX’,
CREDENTIAL = ElasticDBQueryTeste,
) ;

Existem vários parâmetros que podem ser fornecidos na cláusula TYPE, mas como queremos conectar em um AzureSQL precisaremos utilizar o valor “RDBMS”. 

6- Criar a External Table: 
CREATE EXTERNAL TABLE [dbo].[BuildVersion] 

[SystemInformationID] tinyint,
[Database Version] nvarchar(25),
[VersionDate] datetime 
)
WITH 
( DATA_SOURCE = DS_ElasticDBQueryTeste) 

7- Conceder permissão para o usuário criado no passo 1: 
grant select on [dbo].[BuildVersion] to sqluser 

8- Realizar o teste de leitura na External Table criada anteriormente:
select systeminformationid, [database Version] from [dbo].[BuildVersion] 

Para concluir, é importante salientar que o External Table é uma nova abordagem para uma feature antiga que gera melhor eficiência, segurança e velocidade. 

Saiba mais sobre como fazer cross database com haddop, mongodb, etc. em:
 https://docs.microsoft.com/pt-br/sql/t-sql/statements/create-external-table-transact-sql?view=sql-server-ver15&tabs=dedicated?WT.mc_id=DP-MVP-5002511 

Esperamos que este post seja útil para você!