SQL Server 2000 時代,「架構」與「用戶」概念模糊不清,DatabaseOwner 即代表擁有者。SQL Server 2005 引入 Schema(架構) 作為獨立命名空間,徹底解耦「誰擁有物件」與「誰存取物件」。
「資料庫架構是一個獨立於資料庫用戶的非重複命名空間。您可以將架構視為物件的容器。可以在資料庫中建立和變更架構,並且可以授予用戶存取架構的權限。任何用戶都可以擁有架構,並且架構所有權可以轉移。」(MSDN 官方定義)
| # | 特性 | 說明 |
|---|---|---|
| 1 | 同名物件隔離 | 同一架構下不允許同名物件;不同架構可共存同名物件(如 HR.Employees vs Sales.Employees)。 |
| 2 | 單一擁有者 | 架構擁有者可以是用戶、資料庫角色、應用程式角色。 |
| 3 | 角色可擁有多架構 | 資料庫角色可設定預設架構,並同時擁有多個架構。 |
| 4 | 多用戶共享預設架構 | 多個資料庫用戶可共用同一 DEFAULT_SCHEMA,簡化權限管理。 |
| 5 | 刪除用戶不刪物件 | 架構獨立於用戶,DROP USER 僅移除安全主體,架構內物件完好保留。 |
| 6 | 四段式命名規範 | [Server].[Database].[Schema].[Object] 取代 2000 版 [Server].[Database].[Owner].[Object]。 |
文章引用兩張關鍵圖表(2017010511304808.jpg、2017010511304821.jpg),分別展示:

-- 為每個租戶建立獨立 Schema
CREATE SCHEMA Tenant_A AUTHORIZATION dbo;
CREATE SCHEMA Tenant_B AUTHORIZATION dbo;
-- 同名資料表互不干擾
CREATE TABLE Tenant_A.Orders (...);
CREATE TABLE Tenant_B.Orders (...);
-- 應用連接時指定 DEFAULT_SCHEMA
ALTER USER AppUser WITH DEFAULT_SCHEMA = Tenant_A;
Dev Schema,測試組擁有 QA Schema,生產環境使用 Prod Schema。usp_GetOrders 在三個 Schema 並存,部署時僅切換 DEFAULT_SCHEMA 或在程式碼中冠上 Schema 前綴。-- 僅授予 Schema 級 SELECT 權限,不授予 Table 級權限
GRANT SELECT ON SCHEMA::Sales TO ReportUser;
-- ReportUser 自動獲得 Sales Schema 所有現有及未來物件的 SELECT 權限
SELECT * FROM dbo.Orders 仍可執行,但建議逐步改為 Sales.Orders 以利未來重構。sysobjects.uid 廢用,改查 sys.schemas.principal_id 關聯 sys.database_principals。Schema/用戶分離是 SQL Server 2005 最具影響力的架構升級之一。它將「命名空間管理」與「安全主體管理」解耦,為多租戶、微服務資料庫模式、DevOps 自動化部署奠定了堅實基礎。掌握 Schema 設計模式,是現代 SQL Server 架構師的必修課。