首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 同義詞與序列實戰指南:跨 Schema 存取簡化與主鍵自動生成核心技巧

     編輯:Oracle 資料庫基礎

同義詞:物件的別名與跨 Schema 橋樑

核心概念

  • 同義詞為資料庫物件提供替代名稱
  • 簡化跨 Schema 存取:SELECT * FROM scott.dept → SELECT * FROM dept (建立同義詞後)
  • 支援 TABLE、VIEW、SEQUENCE、PROCEDURE、FUNCTION、PACKAGE、TYPE 等物件

兩類同義詞

類型建立者可見性權限需求
Private (預設)任意用戶僅建立者可用需對象物件權限
PublicDBA / CREATE PUBLIC SYNONYM所有用戶可用需對象物件權限 + PUBLIC 同義詞權限

建立與管理語法

-- Private 同義詞
CREATE SYNONYM dept FOR scott.dept;
DROP SYNONYM dept;

-- Public 同義詞
CREATE PUBLIC SYNONYM dept FOR scott.dept;
DROP PUBLIC SYNONYM dept;

實戰場景

  • 應用解耦:程式碼寫死同義詞名,切換後端 Schema 僅改同義詞指向
  • 遷移過渡:舊表名保留同義詞指向新表,零代碼變更上線
  • 簡化權限:授權同義詞而非基表,隱藏真實 Schema 結構

序列:分散式唯一值生成器

核心特性

  • 獨立於交易,不回滾:即使交易回滾,序列值已消耗不再重用
  • 高併發安全:內部鎖機制保證唯一性
  • 可正向/反向、循環/不循環、緩存/不緩存

建立語法全參數

CREATE SEQUENCE my_seq
  START WITH 1           -- 起始值
  INCREMENT BY 1         -- 遞增量 (負值為遞減)
  MINVALUE 1             -- 最小值
  MAXVALUE 999999999999  -- 最大值
  CACHE 20               -- 記憶體預取數量 (效能關鍵)
  NOCYCLE                -- 到達極值不循環 (預設)
  ORDER;                 -- 保證跨實例順序 (RAC 必加,單實例可省)

使用方法

-- 取得下一值 (每次呼叫遞增)
SELECT my_seq.NEXTVAL FROM dual;

-- 查看當前值 (僅當 Session 已呼叫過 NEXTVAL)
SELECT my_seq.CURRVAL FROM dual;

關鍵行為驗證

-- 測試:回滾不回收序列值
SELECT my_seq.NEXTVAL FROM dual;  -- 返回 1
ROLLBACK;
SELECT my_seq.NEXTVAL FROM dual;  -- 返回 2 (非 1!)

-- 測試:重啟資料庫後 CURRVAL 失效
-- 需先呼叫 NEXTVAL 再用 CURRVAL

管理操作

-- 修改遞增量
ALTER SEQUENCE my_seq INCREMENT BY 5;

-- 修改其他屬性 (MAXVALUE, CACHE, CYCLE 等)
ALTER SEQUENCE my_seq MAXVALUE 9999999999999999 CACHE 100;

-- 查看序列定義
SELECT * FROM user_sequences WHERE sequence_name = 'MY_SEQ';

-- 重設序列 (需刪除重建或特殊技巧)
-- 技巧:ALTER SEQUENCE INCREMENT BY -val; SELECT NEXTVAL; ALTER SEQUENCE INCREMENT BY 1;

效能優化:CACHE 參數科學設定

場景CACHE 值理由
高併發 OLTP 主鍵100-1000減少序列鎖爭用,容忍間隙
單據編號、發票號 (需連續)NOCACHE避免重啟/實例故障導致間隙
RAC 環境CACHE + ORDERORDER 保證全域順序,CACHE 減少跨實例協調
低頻批次20 (預設)平衡預取與間隙

同義詞 + 序列組合拳:應用透明主鍵生成

-- 1. 核心 Schema 建立序列
CREATE SEQUENCE core_seq START WITH 1 CACHE 100;

-- 2. 建立 Public 同義詞
CREATE PUBLIC SYNONYM core_seq FOR core_schema.core_seq;

-- 3. 應用端統一呼叫
INSERT INTO orders (order_id, ...) VALUES (core_seq.NEXTVAL, ...);
-- 即使 orders 表在不同 Schema,同樣可用 core_seq.NEXTVAL

避坑指南

  • ❌ 序列用於「無間隙」業務單號 → 序列本質有間隙 (回滾、重啟、緩存失效)
  • ❌ RAC 環境無 ORDER 導致主鍵亂序 → 必加 ORDER
  • ❌ Public 同義詞過多導致命名衝突 → 命名規範:syn_<schema>_<object>
  • ❌ 同義詞指向被刪除物件 → 定期清理無效同義詞 SELECT * FROM dba_synonyms WHERE table_owner NOT IN (SELECT username FROM dba_users)
  • ✅ 關鍵序列設定監控:SELECT sequence_name, cache_size, last_number FROM dba_sequences WHERE cache_size > 100

同義詞以「別名」消除硬編碼耦合,序列以「單調遞增」解決分散式唯一性。兩者結合,構建靈活可擴展的資料庫物件存取與主鍵生成基礎設施。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved