Nach dem Abwägen der Feature-Sets entschied ich mich, die Einrichtung meiner lokalen Datenbank und Azure SQL zu unterscheiden.
- Wenn lokale SQL-Server-Datenbank will eine Azure SQL-Datenbank verweisen, kann es tun, so Linked Server mit
- Wenn ein Kerl Azure SQL-Datenbank eines andere Azure SQL-Datenbank verweisen will, nur dann über die externe Datenquelle
dh lokal
-- Make a link to the cloud
EXEC sp_addlinkedserver
@server=N'MyExternalServer',
@srvproduct=N'Azure SQL Db',
@provider=N'SQLNCLI',
@datasrc=N'<server address>',
@catalog='<database name>';
GO
EXEC sp_addlinkedsrvlogin
@rmtsrvname = '<server address>',
@useself = 'FALSE',
@locallogin=NULL,
@rmtuser = '<username>',
@rmtpassword = '<password>'
GO
select * from [MyExternalServer].[<database name>].[<schema>].[<table name>]
Während für Azure SQL:
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>';
CREATE DATABASE SCOPED CREDENTIAL ElasticDBQueryCred
WITH IDENTITY = '<username>',
SECRET = '<password>';
CREATE EXTERNAL DATA SOURCE MyElasticDBQueryDataSrc WITH
(TYPE = RDBMS,
LOCATION = '<server>',
DATABASE_NAME = '<database name>',
CREDENTIAL = ElasticDBQueryCred,
) ;
create schema <internalschema>
CREATE EXTERNAL TABLE <internalschema>.<internaltablename>
(
... // list of columns
WITH
(DATA_SOURCE = MyElasticDBQueryDataSrc,
SCHEMA_NAME = <schema>,
OBJECT_NAME = <table name>
)
select * from <internalschema>.<internaltablename>
Die Herausforderung besteht nun darin, die Datenbankskripte mit beiden Methoden gemeinsam zu machen. Um eine Tabelle unter Verwendung von Verbindungsserver zu referenzieren, muss sie unter Verwendung der vierteiligen Kennung [server].[database].[schema].[tablename]
adressiert werden. Vergleichen Sie dies mit einer externen Datenquelle, in der es nur unter Verwendung von [schema].[tablename]
adressiert werden kann.
Ausgehend von dieser Frage: https://dba.stackexchange.com/questions/74566/sql-server-using-4-part-identifiers-when-database-may-be-on-the-same-server, ist mein Ansatz, ein Synonym für meine lokale Datenbank zu erstellen, die [schema].[tablename]
zu [externalserver].[externaldatabase].[externalschema].[tablename]
umleitet.
dh lokal:
create schema <internalschema>
CREATE SYNONYM <internalschema>.<internaltablename> FOR [MyExternalServer].[<database name>].[<schema>].[<table name>]
Nach dem, die gleiche Aussage für beide Fälle funktionieren würde:
select * from <internalschema>.<internaltablename>
EDIT: Ein großes Problem bei diesem Ansatz ist, dass Sie nicht Ihr Skript wickeln können unter verteilter Transaktion, da Azure SQL DTC nicht zulässt.
Leider ist SQL Server 2016 immer noch Vorschau, und es gibt keine Express Edition überhaupt –
Ja ... nur Kundenvorschau. –