

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 RDS Custom for SQL Server 變更資料擷取 (CDC) 支援
<a name="custom-sqlserver-features.cdc"></a>

## 概觀
<a name="custom-sqlserver-features.cdc.overview"></a>

RDS Custom for SQL Server 提供變更資料擷取 (CDC) 的原生支援，可讓您追蹤及擷取 SQL Server 資料表中的資料修改。CDC 會存放這些變更的詳細中繼資料，以供後續擷取和分析。如需 CDC 運作方式的詳細資訊，請參閱 Microsoft 文件中的[變更資料擷取](https://docs.microsoft.com/en-us/sql/relational-databases/track-changes/track-data-changes-sql-server#Capture)。

SQL Server 中的 CDC 作業需要 `sys.servers` 與 `SERVERPROPERTY('ServerName')` 識別符中*本機伺服器* (其 `server_id` = 0) 之間的相符值。RDS Custom for SQL Server 會在執行個體的整個生命週期中自動維持此同步，以確保 CDC 持續運作，即使主機在維護或復原作業期間遭到取代也一樣。

**重要**  
在多可用區域執行個體容錯移轉之後，`SERVERPROPERTY('Servername')` 函數會自動反映網路/電腦名稱的變更。不過，`@@SERVERNAME` 函數會保留舊的伺服器名稱，直到 `MSSQLSERVER` 服務重新啟動為止。查詢 @@SERVERNAME 會在容錯移轉後傳回先前的伺服器名稱。若要在容錯移轉後取得準確的伺服器名稱，請使用下列 SQL 查詢：  

```
SELECT name FROM sys.servers WHERE server_id=0
```
此查詢提供最新伺服器名稱資訊，而不需要重新啟動服務。

## 區域和版本可用性
<a name="custom-sqlserver-features.cdc.regionAvail"></a>

對於 RDS Custom 支援的所有 SQL Server 版本，提供 RDS Custom for SQL Server 的所有 AWS 區域 中都支援 CDC 功能。如需 RDS Custom for SQL Server 的支援版本和區域可用性的詳細資訊，請參閱 [支援的 RDS Custom for SQL Server 區域和資料庫引擎](Concepts.RDS_Fea_Regions_DB-eng.Feature.RDSCustom.md#Concepts.RDS_Fea_Regions_DB-eng.Feature.RDSCustom.sq)。

## 要求與限制
<a name="custom-sqlserver-features.cdc.reqsLims"></a>

在 RDS Custom for SQL Server 上實作 CDC 時，請注意下列重要考量：
+ 如果您在 `sys.servers` 中手動設定 `@@SERVERNAME` 和/或*本機伺服器*以使用 MS 複寫等功能，則若 `sys.servers` 中的本機伺服器 (具有 `server_id = 0`) 的值設定為符合 `*.rds.amazonaws.com` 或 `*.awsrds.*.com` 的格式，RDS Custom for SQL Server 不會嘗試修改它以符合 `SERVERPROPERTY('ServerName')`。
+ 當遠端登入或連結伺服器正在使用舊的主機名稱時，RDS 無法將 `sys.servers` 中的本機伺服器 (具有 `server_id = 0`) 修改為新的主機名稱。此限制適用於兩種情況：
  + 當連結的伺服器使用與舊主機名稱相關聯的遠端登入來建立與本機伺服器的連線時
  + 當 RDS Custom for SQL Server 執行個體做為發布者或經銷商，且已將與舊主機名稱相關聯的登入連結至其訂閱用戶執行個體時。

## 故障診斷
<a name="custom-sqlserver-features.cdc.Troubleshooting"></a>

若要識別與舊伺服器名稱相關聯的遠端登入或連結的登入，請使用下列查詢。驗證結果並移除這些登入，以確保適當的 CDC 功能。

```
SELECT * FROM sys.remote_logins WHERE server_id=0
```

或

```
select sss.srvname,ssp.name,srl.remote_name  from sys.server_principals ssp 
inner join sys.remote_logins srl on srl.local_principal_id=ssp.principal_id
inner join sys.sysservers sss  on srl.server_id = sss.srvid
where sss.srvname = @@SERVERNAME
```