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

Oracle DUAL表完全指南:結構、特殊行為、風險操作與災難恢復

     編輯:Oracle 資料庫基礎

一、DUAL表基本用途

Oracle內建單行單欄表 (SYS.DUAL,PUBLIC SYNONYM),任何用戶可讀,用於無目標表的SELECT:

SELECT USER FROM dual;           -- 當前用戶
SELECT SYSDATE FROM dual;        -- 當前日期時間
SELECT 1+2 FROM dual;            -- 當計算機
SELECT seq.nextval FROM dual;    -- 取序列值

二、DUAL表結構與權限

-- 結構
CREATE TABLE sys.dual (dummy VARCHAR2(1)) TABLESPACE system ...;

-- 權限
GRANT SELECT ON sys.dual TO PUBLIC WITH GRANT OPTION;
  • VARCHAR2(1)而非CHAR(1):極簡設計,減少檢索開銷
  • 置於SYSTEM表空間:隔離用戶表空間,效能考量

三、DUAL的特殊內部行為 (核心機制)

Oracle內核強制SYS.DUAL掃描永遠只回傳一行,無論實際資料筆數:

INSERT INTO dual VALUES ('Y');  -- 成功插入
COMMIT;
SELECT * FROM dual;             -- 仍只回傳 'X' (原始行)
SELECT SYSDATE FROM dual;       -- 只回傳一行日期

四、危險操作與後果

操作實際結果風險
INSERT多行內部邏輯過濾,SELECT仍只見一行PL/SQL SELECT ... INTO 可能拋 TOO_MANY_ROWS (ORA-01422)
TRUNCATE TABLE dual表變空SELECT SYSDATE FROM dual 回傳 NO DATA FOUND (ORA-01403),大量程式失效
DELETE FROM dual每次僅刪一行,內部保護機制最終仍可能刪光,同TRUNCATE後果
DROP TABLE dual成功資料庫無法啟動,報 ORA-1092

鐵律:DUAL表必須永遠有且僅有一行資料,嚴禁DML/DDL操作,嚴禁授予UPDATE/INSERT/DELETE權限。

五、DUAL表被刪除/損壞的災難恢復步驟

-- 1. SYS用戶建立PFILE並關閉
CREATE PFILE='d:\pfile.bak' FROM SPFILE;
SHUTDOWN IMMEDIATE;

-- 2. 編輯PFILE,最後加入
replication_dependency_tracking = FALSE

-- 3. 以PFILE啟動 (允許操作系統表)
STARTUP PFILE='d:\pfile.bak';

-- 4. 重建DUAL表
CREATE TABLE "SYS"."DUAL" ("DUMMY" VARCHAR2(1)) PCTFREE 10 PCTUSED 4;
INSERT INTO dual VALUES ('X');
COMMIT;
GRANT SELECT ON dual TO PUBLIC;

-- 5. 驗證
SELECT * FROM dual;  -- 應回傳 X

-- 6. 正常重啟
SHUTDOWN IMMEDIATE;
STARTUP;  -- 使用SPFILE正常啟動

預防勝於治療:建立DDL觸發器攔截對SYS.DUAL的危險操作,並納入巡檢腳本定期驗證SELECT COUNT(*) FROM dual恆為1。

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