Oracle 11g 的新特性 —— 唯讀表

來源:互聯網
上載者:User

上次我們介紹了 Oracle 11g 的新特性 —— 虛擬列,今天我們介紹另外一個新特性 —— 唯讀表。

唯讀表跟普通的表沒有區別,但不允許任何事務對其執行任何 DML(Insert, Update, Delete) 操作。

在 Oracle 11g 之前,“唯讀”只對資料庫和資料表空間有效,而到了 11g,你可以設定某個表為唯讀表。

在 11g 之前,如果我們要實現一個唯讀表,必須通過觸發器和約束限制來實現。

1- 表觸發器

下面我們簡單建立一個表和觸發器來示範這種方法:

 
01 CREATE TABLE READ_ONLY_TABLE (COL1 NUMBER);  
02      
03  CREATE OR REPLACE TRIGGER READ_ONLY_TABLE_TRG  
04    BEFORE DELETE OR INSERT OR UPDATE  
05    ON READ_ONLY_TABLE  
06    REFERENCING NEW AS NEW OLD AS OLD  
07    FOR EACH ROW  
08  DECLARE  
09  BEGIN  
10    RAISE_APPLICATION_ERROR (-20001, 'Table is read only table.');  
11  END;  
12      
13  INSERT INTO READ_ONLY_TABLE  
14     VALUES (1);

運行這個指令碼你將會得到錯誤資訊:

ORA -20001, Table is read only table.

2- 檢查約束

使用下面的 SQL 陳述式:

 
1 CREATE TABLE READ_ONLY_TABLE2 (COL1 NUMBER);  
2     
3 ALTER TABLE READ_ONLY_TABLE2 ADD CONSTRAINT READ_ONLY_CONST CHECK(0=0) DISABLE VALIDATE;  
4     
5 INSERT INTO READ_ONLY_TABLE2  
6    VALUES (1);

執行的報錯資訊:

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;

運行結果:

全文完!

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.