Autores 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ê!