Občas je potřeba mít možnost se z jedné Azure databáze připojit do druhé Azure databáze a udělat si cross select.
Něco ve stylu:
select
*
from [db1].[schema1].[table1] a
left join [db2].[schema2].[table2] b
on a.Key = b.Key
Problém je v tom, že Azure databáze, hostované na stejném Azure SQL serveru, na sebe vzájemně nevidí. Není možné tedy nativně udělat join mezi tabulkami z různých databází.
Toto se dá vyřešit registrací externích datových zdrojů.
Prostě si v databázi A zaregistrujeme požadovanou tabulku z databáze B jako externí zdroj.
- Musíme vytvořit kredenc, pod kterým se budeme z A databáze hlásit do B databáze. Jde tedy o uživatele B databáze.
--drop DATABASE SCOPED CREDENTIAL [UzivatelDB_B]
CREATE DATABASE SCOPED CREDENTIAL [UzivatelDB_B]
WITH
IDENTITY = 'sql_uzivatel_DB_B',
SECRET = 'hesl0';
- Pak vytvoříme externí zdroj
--drop EXTERNAL DATA SOURCE [externi_db_B]
CREATE EXTERNAL DATA SOURCE [externi_db_B]
WITH
(
TYPE=RDBMS,
LOCATION='externi_db_B.database.windows.net',
DATABASE_NAME='externi_db_B'
,CREDENTIAL= [UzivatelDB_B]
);
- A na konec vytvoříme v A databázi požadovanou tabulku z B databáze.
Ta tabulka musí být ve stejném schématu a musí mít stejný název.
--drop schema sch_db_B
--create schema sch_db_B
--drop EXTERNAL TABLE [sch_db_B].[tabB]
CREATE EXTERNAL TABLE [sch_db_B].[tabB](
[Id] [numeric](10, 0) NOT NULL,
[Key] [varchar](50) NULL
)
WITH
(
DATA_SOURCE = [externi_db_B]
);
A pak už můžeme v A databázi spustit select.
select top 100 * from [sch_db_B].[tabB];
Deploy
Databáze je definována Visual Studio SQL projektem, který je uložen v Azure DevOps Repository.
Databáze se do Azure prostředí nasazují pomocí Azure Devops Pipeline, která si z repa stáhne aktuální definici. Udělá build přes VS build agenta a výsledný DACPAC soubor deployne do služby v Azure.
Externí data source musí být definován i v SQL projektu, aby byl nasazen přes Azure DevOps Repository a klasický deploy. Pokud by byl vytvořen, na prasáka (jen v SQL databázi), tak ho deploy smaže.
Ve VS SQL projektu musí být definováno to co se při deploy smaže ;-). To co se nesmaže, tak může být definováno přímo v databázi, mimo VS SQL projekt.
Při deploy se nesmaže
- DATABASE SCOPED CREDENTIAL
Při deploy se smaže
- EXTERNAL DATA SOURCE
- EXTERNAL TABLE
Definici externí tabulky a externího datového zdroje je tedy potřeba mít definovanou v Visual Studiu SQL projektu, aby DACPAC obsahoval vše potřebné.
Jsou dvě možnosti jak si zpřístupnit jinou Azure SQL databázi.
Buď se nasdílí konkrétní tabulka a nebo celý datový zdroj (databáze) – každé má své použití, tak vybírat správně.
Btw přes ten link mezi databázemi tečou data pomalu.
Užitečné dokumentační linky
https://azure.microsoft.com/nl-nl/blog/querying-remote-databases-in-azure-sql-db/
https://docs.microsoft.com/en-us/sql/t-sql/statements/create-external-data-source-transact-sql?view=sql-server-ver15&tabs=dedicated
https://docs.microsoft.com/en-us/azure/azure-sql/database/private-endpoint-overview#how-to-set-up-private-link-for-azure-sql-database