Microsoft Azure SQL Database

Microsoft Azure SQL Database (旧称 SQL Azure, SQL Server Data Services 或 SQL Services) 是由微软SQL Server 2008为主，建构在Microsoft Azure云端操作系统之上，执行云端运算 (Cloud Computing)的关联式数据库服务。

2017年5月，微软于 Build 2017 大会时宣布对 MySQL 与 的 SQL Database 服务。

## 基础架构

Windows Azure SQL Databsae 的基底是SQL Server (通常以最新版为主)，不过它是一个特殊设计的SQL Server，并且以Windows Azure为基座平台，配合Windows Azure的特性，Windows Azure SQL Databsae也是一种分散在许多实体基础架构(Physical Infrastucture)与其内部许多虚拟服务器(Virtual Servers)的一种云端储存服务，外部应用程序或服务可以不用在乎数据库实际储存在哪里，就可以利用Windows Azure SQL Databsae显露的SQL Fabric壳层服务以接受外部链接，并且在内部使用连线绕送 (connection routing) 的方式，让连线可以对应到正确的服务器，而且数据库是在云端中由多个服务器来提供服务，每一次连线所提供服务的服务器可能会不同，因此也可以保证云端储存的高度可用性(High availability)。

Windows Azure SQL Databsae 架构在资料中心可分为三个部分：

服务提供层是 Windows Azure SQL Database 显露在用户端前面的服务界面 (Facade 模式)，负责接取所有向 Windows Azure SQL Databsae 提交要求的 TDS over SSL 连线与指令，当连线进入 Windows Azure SQL Databsae 时，Windows Azure SQL Databsae Load Balancer 会分派连线到不同的 Windows Azure SQL Databsae Gateway 中。Windows Azure SQL Databsae Gateway系负责处理 TDS 连线，管理连接层安全性 (connection-level security) 以及解析指令是否有内含潜在威胁的指令，再交由连线管理员 (Connection Manager) 将连线分派到位于平台提供层内不同的 Windows Azure SQL Databsae 数据库服务器中进行处理，Windows Azure SQL Databsae Gateway 也会管理对 SQL Azure 的连线，以避免可能会封锁住服务器的连线 (例如过长的查询或过长的数据库交易等)。

平台提供层则是以 Windows Azure Computes 的虚拟机器丛集 (Cluster)，每台虚拟机器都安装有 SQL Server 以及管理一定数量的数据库，通常一份数据库会分散到三至五台的 SQL Server VM 中，而每台 SQL Server VM 也安装了 SQL Fabric 中控软件，并透过 SQL Fabric 与 Windows Azure SQL Databsae Gateway 的管控下，所有对单一数据库的连线都不一定会持续连入同一台 SQL Server VM 中。SQL Server VM 内也安装了 SQL Azure Management Service，它会负责对每个数据库间的资料复写工作，以保障 Windows Azure SQL Databsae 的基本高可用性要求。每台 SQL Server VM 内的 SQL Fabric 和 Management Service 都会彼此交换健康与监控资讯等，以保持整体服务的健康与可监控性。

基础建设层由 Windows Azure Computes 以及其高度可扩充性的运算与网络基础架构来组成，以支援 Windows Azure SQL Databsae 所需的高可用性以及高扩充性等云端特色。

## 供应模型

Windows Azure SQL Databsae 服务对外的供应模型 (Provisioning Model) 的设计以平缓企业进入云端的学习曲线为主要考量，因此 Windows Azure SQL Databsae 对外提供的是一台逻辑服务器 (Logical Server)，此服务器是由 SQL Gateway 所显露，每一个 Windows Azure 的账户都可以建立一台 SQL Database Server，就像在本地的 SQL Server 执行个体一样，但这个执行个体是在云端上执行且具有高可用性等特征的数据库服务器。

每台 SQL Database Server 都具有下列内容：

- DNS 名称，用户端应用程序要使用这个 DNS 名称连入数据库，格式为 serverid.database.windows.net。
- master 数据库，此数据库会存放登入资讯 (logins)，服务器角色以及管理服务器所必要的动态管理检视表 (Dynamic Management View)。
- Windows Azure SQL Databsae 防火墙，用来管理连入 SQL Database Server 的连线来源。
- 使用者数据库，每个数据库都有不同的计费标准，大小由 100MB 到 150GB 不等。一台 SQL Database Server 可以有多个使用者数据库。

用户端只要可以支援 TDS (Tabular Data Stream) over SSL，即可连线与存取 SQL Database Server 的数据库资源，这表示像ODBC、ADO.NET或JDBC的 SQL Server 最新版驱动程式或SQL Native Client Library都可以连接到SQL Database Server。

## Transact-SQL的支援

作为SQL Server版本Transact-SQL的子集，不是所有的功能在Windows Azure SQL Databsae上都有被支援，由于实体服务器架构以及安全性的问题，许多分散式的查询法以及常用的数据库复制法都没有办法被Windows Azure SQL Databsae支援，而在SQL Server 2005开始加入的SQL CLR能力也无法在Windows Azure SQL Databsae上支援（因为它必须要挂载在Windows Azure SQL Databsae实体服务器上，但用户端通常无法知道当下连到的服务器是否为有安装SQL CLR组件的那一台）。

受支援的Transact-SQL特性：

- 常数。
- 资料限制。
- 资料游标。
- 数据库索引管理与索引重建。
- 本地数据库暂存表格。
- 保留字。
- 预存程序。
- 数据库统计管理。
- 数据库交易
- 触发程序。
- 数据库表、资料表联结以及表格变数。
- Transact-SQL语言元素，像是对数据库、表格、使用者与登入等的建立、修改与删除。
- 使用者定义函数。
- 检视表。

未受支援的Transact-SQL特性：

- SQL CLR。
- 数据库档案配置。
- 数据库映射。
- 分散式查询。
- 分散式交易。
- 档案群组管理。
- 全域暂存表格。
- 稀疏资料与索引。
- SQL Server组态选项。
- SQL Server Service Broker
- 系统表格。
- 追踪旗标。

## 安全性

Windows Azure SQL Databsae 的安全性有两个部分，一个是管理传输层次安全性的防火墙，一个是管理存取控制的基本安全功能。

### 防火墙

每个 SQL Database Server 都会有自己的防火墙 (Firewall) 设定，管理人员可以自由设定下列不同的用户端来源模型：

- 只允许云端应用程序存取 SQL Azure Server，网段设为 0.0.0.0-0.0.0.0
- 单一或多重网址 (address)。
- 单一或多重网段 (segment)。

SQL Database Server 的防火墙设定会储存在 SQL Gateway 中，作为管控用户端连线之用。

### 基本安全功能

SQL Database Server会有两种安全群组：

- 服务器角色：有`dbmanager`以及`loginmanager`两种。
- `dbmanager`：赋与使用者可以建立数据库（即CREATE DATABASE指令）的权利。
- `loginmanager`：赋与使用者可以建立登入账户（即CREATE LOGIN指令）的权利。
- 数据库角色：与安装在本机或服务器上版本的SQL Server相同。

SQL Database Server目前只支援使用SQL验证（SQL Authentication）的安全验证方式，以往的Windows验证在Windows Azure SQL Database上不支援。而在SQL Database Server建立时，除了master数据库以外，还会再多建立一个具有SQL Server的sa账户相等权力的账户，供使用者操作SQL Database Server用，此账户称为服务器级主账户（server-level principal），基于数据库的安全，管理人员必须要在 SQL Database Server 中再建立一个或多个登入账户后，再授权给数据库，用户端应用程序不宜使用服务器级主账户来存取 SQL Azure Server 与数据库。

### 限制

Windows Azure SQL Database 基于架构上的设计与天生的限制，SQL Database Server的账户与安全控制会有下列限制：

- 只有服务器级主账户才具有变更密码的能力，`loginmanager`群组的成员账户不具变更密码的权限，同时如果要存取master数据库，则该使用者账户必须要被对应到master数据库，同时服务器级主账户是不可以变更或删除的，同时只要是被设为服务器级主账户的使用者，就算没有给予`dbmanager`或`loginmanager`，仍然可以建立数据库并管理使用者。
- 只要是登入服务器，一律以master为预设数据库，US-English为预设的登入语系。
- 若要执行`CREATE/ALTER/DROP LOGIN`或`CREATE/DROP DATABASE`，必须要先连至master数据库。
- 当要在ADO.NET执行前述指令时，不可以使用参数化命令，而且前述命令于每个SQL批次也只能有一个（且是唯一的一个）。
- 当要执行`CREATE USER`配合`FOR/FROM LOGIN`选项时，它也必须是SQL批次中唯一的一个。
- 当要执行`ALTER USER`配合`WITH LOGIN`选项时，它也必须是SQL批次中唯一的一个。
- 只有服务器级主账户以及被赋与`dbmanager`角色的成员才有执行`CREATE DATABASE`与`DROP DATABASE`的权力。
- 只有服务器级主账户以及被赋与`loginmanager`角色的成员才有执行`CREATE LOGIN`、`ALTER LOGIN`与`DROP DATABASE`的权力。
- 若想存取master数据库，则该账户必须要对应到master数据库。

## 工具与开发支援

Windows Azure SQL Database 基于数据库云端化并降低学习曲线的主要诉求之下，开发工具与管理工具基本上会与 SQL Server 完全相同，但也有基于 SQL Database 所发展的工具。

### 开发工具

开发人员可利用Visual Studio 2010 的服务器管理员也可以连接到 SQL Database Server 并管理数据库与资料结构。SQL Server 2008 (非R2) 则可透过输入连线字串的方式连接 SQL Database Server，或是使用命令列工具 sqlcmd.exe 连到 SQL Database Server。在 Windows Azure SQL Database 管理界面中可获得连线字串的范例。

SQL Database Server 可接受 TDS over SSL 的通讯与指令，因此开发人员可利用 ADO, ADO.NET, Entity Framework, LINQ to SQL 或其他可产生 TDS over SSL 的用户端函式库 (ex: SQL Native Client, JDBC, SQL Server Driver for PHP 等) 来存取 SQL Database Server 与数据库。

### 管理工具

SQL Server Management Studio 可直接管理 Windows Azure SQL Database，但目前只有 SQL Server 2008 R2 可完全相容于 Windows Azure SQL Database 的管理，而 SQL Server 2008 的 SSMS 仅支援 Transact-SQL 指令层次的管理，SQL Server 2005 以及更早版本的 SQL Server 管理工具则无法支援。除了 Management Studio 以外，微软也在 Windows Azure Portal 中设计了 SQL Azure Database Manager (原先的 SQL Azure Web Administrator)，让管理人员得以直接利用 Windows Azure Portal 来管理数据库内的物件 (如资料表，预存程序，检视表等物件)。

### 服务管理 API

Windows Azure SQL Database 在2011年五月份的更新中，加入了一组服务管理的 API，称为 SQL Azure Server API，它允许开发人员使用与 Windows Azure 服务管理 API 相似的方式存取 Windows Azure SQL Database 上的管理资讯，并且可直接下指令给 SQL Database Server 来执行一些管理工作。

## 其他服务

### OData Services

这是在 Windows Azure SQL Database 开发初期时提供的 REST API 群，在 SQL Azure 团队决定使用 TDS 协定开放 SQL Azure 数据库后即暂停开发，在 Windows Azure SQL Database 服务正式发布后，这个 REST API 群即恢复开发，此 REST API 可符合 OData 协定规格，目前已经停止开发，由 ASP.NET MVC OData 支援或 WCF Web API OData 支援功能取代。

### SQL Reporting

这是 Windows Azure SQL Database 上的 Reporting Services，可以让企业与开发人员直接利用 SQL Azure 数据库来产制 Business Intelligence 的解决方案，SQL Reporting Services 可支援 SQL Server Reporting Services 的大部分功能，并且沿用 Business Intelligence Development Studio 作为报表开发的工具。

### SQL Data Sync

SQL Data Sync 是微软开发作为云端 (Cloud) 与本地端 (On-premise) 资料同步化的服务，以Microsoft Sync Framework为基础的同步工具，可以在云端与企业内部或用户端 (手持式装置或是电脑) 进行资料的同步工作。

## 外部链接

SQL Azure MSDN Online Documentation SQL Server Data Services Official Site