Schema (模式/架構) 是數據庫對象的邏輯容器,三大主流 RDBMS 對 Schema 的定義、用戶關係、訪問語法差異巨大。理解差異是異構遷移、多數據庫適配、跨庫查詢的基礎。本文從定義、用戶映射、對象訪問、創建刪除、權限模型五個維度深度對比,附遷移對照表。
| 維度 | MySQL | SQL Server | Oracle Database |
|---|---|---|---|
| Schema 概念 | Database = Schema (同義詞) | 獨立於 Database 的對象容器 | 用戶 = Schema (1:1 綁定) |
| 創建語句 | CREATE DATABASE / CREATE SCHEMA | CREATE SCHEMA | CREATE USER (隱式創建同名 Schema) |
| 刪除語句 | DROP DATABASE / DROP SCHEMA | DROP SCHEMA | DROP USER [CASCADE] (刪除 Schema 及對象) |
| 默認 Schema | 無 (需 USE 或 db.table) | dbo (內置) | 當前登錄用戶 |
| 跨 Schema 訪問 | db.table | schema.table / database.schema.table | user.table (需權限) |
CREATE USER 創建,與 Schema 無綁定GRANT SELECT ON db.* TO userUSE db 設置會話默認 SchemaDEFAULT_SCHEMA,未指定則為 dboserver.database.schema.object (四部分命名)GRANT SELECT ON SCHEMA::sales TO userCREATE USER scott IDENTIFIED BY tiger; 同時創建 SCOTT SchemaSELECT * FROM emp 等同 SELECT * FROM scott.empSELECT * FROM hr.employees (需權限)| 場景 | MySQL | SQL Server | Oracle |
|---|---|---|---|
| 當前 Schema 表 | SELECT * FROM t (需 USE db) | SELECT * FROM t (搜尋 default_schema → dbo) | SELECT * FROM t (當前用戶 Schema) |
| 指定 Schema 表 | SELECT * FROM db.t | SELECT * FROM schema.t 或 db.schema.t | SELECT * FROM user.t |
| 跨 Database/Instance | db1.t JOIN db2.t (同實例) | db1.schema.t JOIN db2.schema.t | dblink / user.t@link |
| 同義詞/別名 | 不支援 | SYNONYM (Database 級) | PUBLIC/PRIVATE SYNONYM |
| 特性 | MySQL | SQL Server | Oracle |
|---|---|---|---|
| 權限粒度 | Global / Database / Table / Column | Server / Database / Schema / Object | System / Object (Schema 級) |
| 角色支援 | 8.0+ 原生 Role | 早期支援 Database Role / Server Role | 12c+ 原生 Role |
| Schema 級授權 | 無 (Database 級) | 有 (GRANT ON SCHEMA::) | 無 (User 級即 Schema 級) |
| 所有權鏈 | 無 | 擁有權鏈 | 無 (需顯式授權) |
| MySQL 對象/操作 | SQL Server 等價 | Oracle 等價 | 遷移注意 |
|---|---|---|---|
| CREATE DATABASE shop | CREATE DATABASE shop; CREATE SCHEMA sales; | CREATE USER shop IDENTIFIED BY ...; (建表空間) | Oracle 需預先規劃表空間、配額 |
| USE shop | USE shop (切換 DB) | CONN shop/pass (切換用戶/Schema) | 連接池配置需調整 |
| GRANT SELECT ON shop.* TO app | GRANT SELECT ON SCHEMA::sales TO app; (或逐表) | GRANT SELECT ON shop.emp TO app; (逐對象) | Oracle 無通配符授權,需腳本生成 |
| CREATE TABLE t (id INT PRIMARY KEY) | 同語法 (支援 IDENTITY) | 同語法 (支援 SEQUENCE/IDENTITY 12c+) | 自增列語法差異 |
| DROP DATABASE shop | DROP DATABASE shop | DROP USER shop CASCADE | Oracle 級聯刪除對象 |
| SHOW TABLES | SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='sales' | SELECT * FROM USER_TABLES | 元數據查詢視圖不同 |
hibernate.default_schema 設置默認 Schema;@Table(schema="sales") 顯式指定db.table / schema.table;動態 Schema 用 ${schema} 佔位符databaseName;SQL Server databaseName + schema;Oracle 無 Database 概念,僅 Service Name/SIDdefaultSchema,Oracle 需設定 schemas 列表三大數據庫 Schema 設計哲學迥異:
遷移時**不要機械映射**,而應根據目標平台最佳實踐重新設計命名空間層級:MySQL 多庫 → SQL Server 多 Schema;Oracle 多用戶 → MySQL 多庫 + 用戶權限矩陣。理解本質差異,才能構建真正可移植的數據訪問層。