SQL Server Express等效于EXTERNAL DATA SOURCE

时间:2016-04-20 06:10:25

标签: sql-server azure azure-sql-database sql-server-express

根据https://azure.microsoft.com/en-us/documentation/articles/sql-database-elastic-query-getting-started-vertical/,Azure SQL中的一个数据库现在可以查询其他Azure SQL数据库。对于我的用例,我计划有一个数据库为其他数据库提供参考数据,这非常适合拓扑1(垂直分片)。

这对于部署环境很有用,但对于本地开发,我通常使用SQL Server Express进行开发。从SQL Server 2012 Express开始,CREATE EXTERNAL DATA SOURCE不是有效的语法。

是否有可能从本地开发的外部数据源中获益?

2 个答案:

答案 0 :(得分:1)

在权衡功能集之后,我决定区分本地数据库和Azure SQL的设置。

  • 当本地SQL Server数据库想要引用Azure SQL数据库时,它可以使用链接服务器
  • 执行此操作
  • 当Azure SQL数据库想要引用另一个Azure SQL数据库时,它才会使用外部数据源

即。本地

-- 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>]

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>

现在的挑战是使用这两种方法使数据库脚本很常见。要使用链接服务器引用表,必须使用四部分标识符[server].[database].[schema].[tablename]进行寻址。将其与外部数据源进行对比,只需使用[schema].[tablename]即可解决此问题。

使用此问题的灵感:https://dba.stackexchange.com/questions/74566/sql-server-using-4-part-identifiers-when-database-may-be-on-the-same-server,我的方法是在我的本地数据库上创建一个同义词,将[schema].[tablename]重定向到[externalserver].[externaldatabase].[externalschema].[tablename]

即。本地:

create schema <internalschema>
CREATE SYNONYM <internalschema>.<internaltablename> FOR [MyExternalServer].[<database name>].[<schema>].[<table name>]

之后,同样的陈述适用于两种情况:

select * from <internalschema>.<internaltablename>

编辑: 这种方法的一个大问题是您不能在分布式事务下使用包装脚本,因为Azure SQL不允许DTC。

答案 1 :(得分:0)

如果我们谈论SQL Server,则从SQL Server 2016开始支持外部数据源/表/文件格式 - https://msdn.microsoft.com/en-us/library/dn935022.aspx