上次我們介紹了 Oracle 11g 的新特性 —— 虛擬列,今天我們介紹另外一個新特性 —— 唯讀表。
唯讀表跟普通的表沒有區別,但不允許任何事務對其執行任何 DML(Insert, Update, Delete) 操作。
在 Oracle 11g 之前,“唯讀”只對資料庫和資料表空間有效,而到了 11g,你可以設定某個表為唯讀表。
在 11g 之前,如果我們要實現一個唯讀表,必須通過觸發器和約束限制來實現。
1- 表觸發器
下面我們簡單建立一個表和觸發器來示範這種方法:
01 |
CREATE TABLE READ_ONLY_TABLE (COL1 NUMBER); |
03 |
CREATE OR REPLACE TRIGGER READ_ONLY_TABLE_TRG |
04 |
BEFORE DELETE OR INSERT OR UPDATE |
06 |
REFERENCING NEW AS NEW OLD AS OLD |
10 |
RAISE_APPLICATION_ERROR (-20001, 'Table is read only table.' ); |
13 |
INSERT INTO READ_ONLY_TABLE |
運行這個指令碼你將會得到錯誤資訊:
ORA -20001, Table is read only table.
2- 檢查約束
使用下面的 SQL 陳述式:
1 |
CREATE TABLE READ_ONLY_TABLE2 (COL1 NUMBER); |
3 |
ALTER TABLE READ_ONLY_TABLE2 ADD CONSTRAINT READ_ONLY_CONST CHECK (0=0) DISABLE VALIDATE; |
5 |
INSERT INTO READ_ONLY_TABLE2 |
執行的報錯資訊:
ORA-25128: No insert/update/delete on table with constraint SCOTT.READ_ONLY_CONST) disabled and validated
很麻煩對不對?
而 Oracle 11g 可通過文法 ALTER TABLE table_name RAED ONLY; 來實現唯讀表,看看下面 SQL 陳述式:
1 |
CREATE TABLE READ_ONLY_TABLE3 (COL1 NUMBER); |
2 |
ALTER TABLE READ_ONLY_TABLE3 READ ONLY ; |
3 |
INSERT INTO READ_ONLY_TABLE3 VALUES (1); |
執行後的報錯資訊是:
ORA-12081: update operation not allowed on table "SCOTT"."READ_ONLY_TABLE3"
可是我怎麼知道一個表是否唯讀表呢?
你可以通過資料字典視圖 (ALL_TABLES,DBA_TABLES,USER_TABLES,TABS)中�� READ_ONLY 列得知,如:
1 |
SELECT table_name, READ_ONLY FROM tabs; |
運行結果:
全文完!