在 SQL Server 2000 中,User 與 Schema 綁定緊密(同名預設 Schema),導致許多開發者混淆兩者。SQL Server 2005 徹底分離兩者:User 是資料庫層級的安全主體,Schema 是物件容器(命名空間),兩者是完全不同概念。
| 概念 | 比喻 | 說明 |
|---|---|---|
| Database | 大倉庫 | 最外層容器 |
| Schema | 房間 | 倉庫內的獨立空間,包含物件(Table、View 等) |
| Table | 床 | 放置資料的基本單元,必須在房間內 |
| User | 房間主人/倉庫擁有者 | User 對應 Database,擁有倉庫鑰匙,可存取所有房間 |
| Role | 權限規則 | 決定 User 在特定房間能做什麼(唯讀/讀寫) |
關鍵點:Schema 包含的是 Object,不是 User。User 是 Database 的主人,擁有所有 Schema 的存取權(受 Role 限制)。
Bosco → 自動建立同名 Schema Boscosp_adduser(相容性保留)建立 User 時,仍自動建立同名 SchemaCREATE USER 可指定 DEFAULT_SCHEMA;CREATE SCHEMA 獨立建立dbo Schema(公共房間)執行 CREATE TABLE A 時,A 會建立在哪個 Schema?依優先順序:
DEFAULT_SCHEMA → 建立在該 SchemadboCREATE TABLE MySchema.A) → 建立在指定 Schema(需權限)陷阱警示:若使用者只有 dbo 唯讀權限,建立表會失敗,即使有同名 Schema 也不會用到。
登入 User Sue(預設 Schema 為 Sue),執行 SELECT * FROM mytable:
sys.mytable(系統 Schema)Sue.mytable(預設 Schema)dbo.mytable(公共 Schema)最佳實務:查詢與 DDL 操作永遠明確指定 Schema 前綴,避免掃描 sys、提升效能、防止歧義。
dbo:預設公共 Schema,也是一個 Userguest:來賓 Schemasys:系統物件 SchemaINFORMATION_SCHEMA:標準資訊檢視 Schema其他使用者建立的 Schema 可刪除,這 4 個不可刪除。
User = 安全主體(誰),Schema = 物件容器(放哪)。SQL Server 2005 明確分離兩者,採用 CREATE USER/CREATE SCHEMA、明確指定 DEFAULT_SCHEMA、操作時加 Schema 前綴,是現代 SQL Server 開發的標準作法。