使用自主資料庫讓資料庫具有可攜性

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Azure Synapse Analytics

使用自主資料庫使用者來驗證資料庫層級的 SQL Server 和 Azure SQL 資料庫連線。 自主資料庫是與其他資料庫和託管資料庫的 SQL Server 或 SQL Database 執行個體 (以及 master 資料庫) 隔離的資料庫。

SQL Server 支援 Windows 和 SQL Server 驗證的自主資料庫使用者。 當使用 SQL Database 時,結合自主資料庫使用者與資料庫層級防火牆規則。

本文會檢閱使用自主資料庫模型時,相較於傳統的登入/使用者模型和 Windows 或伺服器層級防火牆規則的優點。 特定的情況下,管理能力或應用程式商務邏輯可能仍然需要使用傳統的登入/使用者模型和伺服器層級防火牆規則。

傳統的登入和使用者模型

在傳統連線模式中,Windows 使用者或 Windows 群組成員會透過經 Windows 驗證的使用者或群組認證連線至資料庫引擎。 使用者也可以提供名稱和密碼,並使用 SQL Server 驗證連線。 在這兩種情況下,master 資料庫的登入必須符合連接的認證。

當資料庫引擎確認 Windows 驗證認證或驗證 SQL Server 驗證認證後,該連線通常會嘗試連線至使用者資料庫。 若要連線至使用者資料庫,登入必須對應 (意即建立關聯) 至使用者資料庫中的資料庫使用者。 當特定資料庫在 SQL Server 中為選擇性但在 SQL Database 中為必要時,連接字串也可指定連接至該資料庫。

重要原則是登入 (在 master 資料庫中) 和使用者 (在使用者資料庫中) 必須存在,且彼此相關。 與使用者資料庫的連線依賴 master 資料庫中的登入。 此相依性限制了將資料庫移至不同託管 SQL Server 執行個體或 Azure SQL 資料庫伺服器的能力。

如果 master 資料庫的連線無法使用 (例如,容錯移轉進行中),會增加整體連線時間,或連線可能會逾時。因此,無法使用的連線可能會降低連線延展性。

自主資料庫使用者模型

在自主資料庫使用者模型中,master 資料庫中的登入不存在。 相反,驗證程序發生在使用者資料庫中。 使用者資料庫中的資料庫使用者在 master 資料庫中沒有關聯的登入。

自主資料庫使用者模式同時支援 Windows 驗證和 SQL Server 驗證。 您可以同時在 SQL Server 和 SQL Database 中使用它。

若要以自主資料庫使用者身分連線,連接字串必須一律包含使用者資料庫的參數。 資料庫引擎使用此參數來了解哪個資料庫負責管理驗證程序。

自主資料庫使用者的活動僅限於驗證資料庫。 資料庫使用者帳戶必須在使用者需要的每個資料庫中單獨建立。 若要變更資料庫,SQL Database 使用者必須建立新連線。 若另一個資料庫中有相同的使用者,SQL Server 中的自主資料庫使用者則可變更資料庫。

在 Azure 中,SQL Database 和 Azure Synapse Analytics 支援使用 Microsoft Entra ID (先前稱為 Azure Active Directory) 身分識別作為自主資料庫使用者。 SQL Database 支援使用 SQL Server 驗證的自主資料庫使用者,Azure Synapse Analytics 則不支援。 如需詳細資訊,請參閱使用 Microsoft Entra 驗證連線到 SQL Database

在您使用 Microsoft Entra 驗證時,使用者可以使用 Microsoft Entra 通用驗證從 SQL Server Management Studio 進行連線。 系統管理員可以將通用驗證設定為需要多重要素驗證,以透過撥打電話、文字簡訊、智慧型卡片和 PIN 碼或行動應用程式通知,來驗證身分識別。 如需詳細資訊,請參閱使用 Microsoft Entra 多重要素驗證

對於 SQL Database 和 Azure Synapse Analytics,連接字串中一律需要資料庫名稱。 因此,在您從傳統模型切換至自主資料庫使用者模型時,無需變更連接字串。 針對 SQL Server 連線,資料庫名稱必須新增至連接字串 (如果尚不存在)。

重要

使用傳統的模型時,伺服器層級角色和伺服器層級權限可以限制對所有資料庫的存取。 使用自主資料庫模型時,具有 ALTER ANY USER 權限的資料庫擁有者和資料庫使用者可以授與資料庫的存取權。 此權限可減少高特殊權限的伺服器登入的存取控制,並擴大要包含高特殊權限的資料庫使用者的存取控制。

防火牆

SQL Server

對於 SQL Server,Windows 防火牆規則適用所有連線,並對登入 (傳統模型連線) 與自主資料庫使用者具有相同的效果。 如需有關 Windows 防火牆的詳細資訊,請參閱設定用於資料庫引擎存取的 Windows 防火牆

SQL Database 防火牆

SQL Database 允許對伺服器層級連線 (登入) 和資料庫層級連線 (自主資料庫使用者) 使用不同的防火牆規則。 SQL Database 連接到使用者資料庫時,會先檢查資料庫防火牆規則。 如果沒有允許存取資料庫的規則,SQL Database 會檢查伺服器層級防火牆規則。 檢查伺服器層級防火牆規則需要存取 SQL Database 伺服器的 master 資料庫。

結合自主資料庫使用者的資料庫層級防火牆規則,不必在連線期間存取伺服器的 master 資料庫。 藉此提供改善的連線延展性。

如需有關 SQL Database 防火牆規則的詳細資訊,請參閱下列主題:

語法差異

傳統的模型 自主資料庫使用者模型
在您連線至 master 資料庫時:

CREATE LOGIN login_name WITH PASSWORD = 'strong_password';

然後,在您連線至使用者資料庫時:

CREATE USER 'user_name' FOR LOGIN 'login_name';
在您連線至使用者資料庫時:

CREATE USER user_name WITH PASSWORD = 'strong_password';
傳統的模型 自主資料庫使用者模型
若要在 master 資料庫的內容中變更密碼,請執行以下操作:

ALTER LOGIN login_name WITH PASSWORD = 'strong_password';
若要在使用者資料庫的內容中變更密碼,請執行以下操作:

ALTER USER user_name WITH PASSWORD = 'strong_password';

SQL 受控執行個體

Azure SQL 受控執行個體的運作方式,類似於自主資料庫內容中的內部部署 SQL Server。 建立自主使用者時,務必將資料庫的內容從 master 資料庫變更為使用者資料庫。 此外,設定內含項目選項時,使用者資料庫不應有作用中連線。 使用下列程式碼作為指南。

警告

下列範例指令碼使用 kill 陳述式關閉資料庫上的所有使用者程序。 在執行此指令碼之前,請確保了解此指令碼的結果且它適合您的業務。 另請確保 SQL 受控執行個體資料庫上沒有其他連線處於作用中狀態,因為指令碼會中斷資料庫上執行的其他程序。

USE master;

SELECT * FROM sys.dm_exec_sessions
WHERE database_id  = db_id('Test')

DECLARE @kill_string varchar(8000) = '';
SELECT @kill_string = @kill_string + 'KILL ' + str(session_id) + '; '  
FROM sys.dm_exec_sessions
WHERE database_id  = db_id('Test') and is_user_process = 1;

EXEC(@kill_string);
GO

sp_configure 'contained database authentication', 1;  
GO
 
RECONFIGURE;  
GO 

SELECT * FROM sys.dm_exec_sessions
WHERE database_id  = db_id('Test')

ALTER DATABASE Test
SET containment=partial

USE Test;  
GO 

CREATE USER Carlo  
WITH PASSWORD='Enterpwdhere*'  

SELECT containment_desc FROM sys.databases
WHERE name='Test'

備註

  • 必須為每個 SQL Server 執行個體啟用自主資料庫使用者。 如需詳細資訊,請參閱自主資料庫驗證 (伺服器組態選項)
  • 自主資料庫使用者與登入具有非重疊的名稱,可以共存於您的應用程式。
  • 假設 master 資料庫中的登入名稱為 name1。 如果您建立了名為 name1 的自主資料庫使用者,當連接字串中提供資料庫名稱時,連接到資料庫時會優先選擇資料庫使用者的內容,而非登入內容。 也就是說,自主資料庫使用者的優先順序高於具有相同名稱的登入。
  • 在 SQL Database 中,自主資料庫使用者名稱不能與伺服器管理帳戶的名稱相同。
  • SQL Database 伺服器管理帳戶一律不可為自主資料庫使用者。 伺服器管理員有足夠的權限來建立及管理自主資料庫使用者。 伺服器管理員可以授與權限給使用者資料庫上的自主資料庫使用者。
  • 因為自主資料庫使用者是資料庫層級主體,所以您必須在每個您想要使用的資料庫,建立自主資料庫使用者。 身分識別僅限於資料庫。 身分識別獨立於 (在所有層面) 在相同伺服器中的另一個資料庫具有相同名稱和相同密碼的使用者。
  • 使用您通常用來登入的相同強度密碼。