﻿# 如何透過 T-SQL 快速建立 SQL 彈性集區中的資料庫

[Azure SQL Database](https://learn.microsoft.com/en-us/azure/azure-sql/database/?WT.mc_id=DT-MVP-4015686) 的 [Elastic pools](https://learn.microsoft.com/en-us/azure/azure-sql/database/elastic-pool-overview?WT.mc_id=DT-MVP-4015686) ([彈性集區](https://learn.microsoft.com/zh-tw/azure/azure-sql/database/elastic-pool-overview?WT.mc_id=DT-MVP-4015686)) 對於我們這種需要大量測試用資料庫，但又大多都是低用量的用戶使用，可以節省大量的雲端費用。不過 Azure SQL Database 還是有幾個很雷的地方，一不小心就會燒掉很多錢。

### 瞭解 Azure SQL Database 與 Azure SQL Server 的基本概念

-   基本架構
    
    -   Azure SQL Server 主要用來管理**伺服器層級**的物件
        -   這個服務類型都是雲端代管的
        -   可以設定**預設管理者帳戶**
        -   可以設定**設定防火牆**，限制 IP 來源存取
        -   可以重置**預設最高權限管理員**的密碼
        -   可以設定 **Active Directory admin** (可授權到一個**群組**)
        -   可以**新增**或**刪除** Azure SQL Database 資料庫
        -   可以連結 **SQL 彈性集區 (SQL elastic pools)** 資源
    -   Azure SQL Database 主要用來管理**資料庫層級**的物件
        -   你可以在資料庫中設定**使用者**與**登入**的對應，跟你在地端的 SQL 資料庫一樣
        -   其他大部分物件都可以跟地端的 SQL Server 資料庫沒有太大差異 (只有些微差異)
-   收費方式
    
    -   所有 Azure SQL Server 都是**免費的**
        -   你想在 `master` 資料庫建立多少 **登入** (Login) 都可以
    -   所有 Azure SQL Database 都是**收費的**
        -   每個資料庫都可以設定**服務等級**，價格也落差很大！

### 使用 Azure Active Directory 授權

我們公司是[使用 Azure AD 來進行授權](https://learn.microsoft.com/zh-tw/azure/azure-sql/database/authentication-aad-overview?WT.mc_id=DT-MVP-4015686)，非常方便管理與設定。

### 關於 SQL 彈性集區 (SQL elastic pools)

SQL 彈性集區 (SQL elastic pools) 是一種獨立的資源，可以與其中一台 Azure SQL Server 進行綁定。

所謂的「彈性集區」就是一個可以幫你管理多個 Azure SQL Database 資料庫，並將所有加入到「彈性集區」的 Azure SQL Database 資料庫，全部當成「一個資料庫」來計費，所有資料庫的 [DTU](https://learn.microsoft.com/en-us/azure/azure-sql/database/service-tiers-dtu) 全部加總之後，就是你必須購買的等級。

請注意，使用 SQL 彈性集區必須與一台 Azure SQL Server 連結，然後從 SQL 彈性集區建立 Azure SQL Database 資料庫，所有計費才會被算在集區中！

### 超大的計費地雷

首先，我們可以先透過 [SQL Server Management Studio (SSMS)](https://learn.microsoft.com/zh-tw/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-ver15) 連線到 Azure SQL Server 的 `master` 資料庫，並且直接在上面建立資料庫！

![SQL Server Management Studio (SSMS) 建立資料庫](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/acbfc3aca05300efd30b-125942885-845fb8c6-5063-4ab2-816c-d8826d3aeedc.jpg)

🔥 **我勸你千萬不要這麼做，除非你口袋夠深！** 🔥

因為透過 SSMS 建立的資料庫，即便 Azure SQL Server 與 Azure SQL elastic pool 連結，預設還是會以「單一資料庫」的方式計價，而且預設選用的等級為 `GP_Gen5_2` 與 `32GB` 資料量。講規格大家沒感覺，這份規格每個月至少約**新台幣 NT$ 14,829 元**，如果你只是想要拿來當測試資料庫的話，下個月看到帳單你就會想哭了！

當然，建立資料庫的時候，其實是可以選取 SLO ([Service Level Objectives](https://www.youtube.com/watch?v=EyLsvDp3yvI)) 服務等級的！如下圖示：

![SSMS 設定 SLO (Service Level Objectives)](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/f085e5c9942a7caaafc2-125947769-507aa229-a33e-4525-a236-4af19cdea69c.jpg)

### 如何直接從 SSMS 建立資料庫並使用 Azure SQL elastic pool 計費

我們建立資料庫之前，要先決定三個要素：

1.  資料庫名稱：`sampledb`
2.  資料定序名稱：`Chinese_Taiwan_Stroke_CI_AS`
3.  彈性集區名稱：`MyElasticPool`

那麼你建立資料庫的命令就會是：

```sql
CREATE DATABASE [sampledb] COLLATE Chinese_Taiwan_Stroke_CI_AS
(
  SERVICE_OBJECTIVE = ELASTIC_POOL ( name = MyElasticPool )
)
```

### 如何複製一個現有資料庫並直接加入 SQL 彈性集區

如果你想要對一份正式運作中的資料庫進行複製，可以在複製的同時直接加入 SQL 彈性集區，以節省費用！

假設有個既有的資料庫叫做 `AIRDB`，我們可以用以下語法快速複製一份完整的資料庫：

```sql
CREATE DATABASE [sampledb] AS COPY OF AIRDB
(
  SERVICE_OBJECTIVE = ELASTIC_POOL ( name = MyElasticPool )
)
```

由於使用 SQL 彈性集區的關係，無論你建立多少資料庫副本，都不會增加額外的資料庫費用！👍

### 如果將既有的「單一資料庫」移至「SQL 彈性集區」

1.  我們架設建立一個 `Basic` 等級的 SQL 資料庫
    
    ```sql
    CREATE DATABASE [sampledb] COLLATE Chinese_Taiwan_Stroke_CI_AS
    (
        EDITION = 'Basic', SERVICE_OBJECTIVE = 'Basic', MAXSIZE = 2 GB
    );
    ```
    
2.  接著我們可以用以下語法將現有的資料庫移至既有的 SQL 彈性集區
    
    ```sql
    ALTER DATABASE [sampledb] MODIFY (
        SERVICE_OBJECTIVE = ELASTIC_POOL ( name = MyElasticPool )
    );
    ```
    

### 查詢所有資料庫的 SLO 名稱與等級

你可以在特定 Azure SQL Server 伺服器下查詢所有資料庫的各種資源管理資訊，其中包含 SLO 名稱：

```sql
SELECT database_name, slo_name, cpu_limit, max_db_memory, max_db_max_size_in_mb
FROM sys.dm_user_db_resource_governance
```

### 相關連結

-   [Azure SQL Database documentation](https://learn.microsoft.com/en-us/azure/azure-sql/database/?WT.mc_id=DT-MVP-4015686)
-   [Elastic pools help you manage and scale multiple databases in Azure SQL Database](https://learn.microsoft.com/en-us/azure/azure-sql/database/elastic-pool-overview)
