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.

  1. 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';
  1. 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]
);
  1. 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