Oracle10g實現只讀表的N種方法
有時為了提高資料的安全性,我們需要把一個或多個表設定為只讀,即不允許對其執行任何 DML(Insert, Update, Delete) 操作。
在Oracle11g中實現只讀表非常簡單,只需要執行alter table ... read only;語句即可;但是在11g之前的版本,“只讀”只對資料庫和表空間有效,如果我們要實現一個只讀表,只能透過其他辦法。
下面就介紹在Oracle10g中實現只讀表的幾種常用方法。首先,我們先建立測試表hoegh。
測試環境
我們在Oracle 10g+Windows Server 2008 Standard R2進行測試。
點選(此處)摺疊或開啟
-
SQL>
-
SQL> select * from v$version;
-
-
BANNER
-
----------------------------------------------------------------
-
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
-
PL/SQL Release 10.2.0.4.0 - Production
-
CORE 10.2.0.4.0 Production
-
TNS for 64-bit Windows: Version 10.2.0.4.0 - Production
-
NLSRTL Version 10.2.0.4.0 - Production
-
- SQL>
建立測試使用者及測試表
我們建立一個測試使用者hoegh,指定預設表空間為users;然後,在hoegh使用者下建立測試表,同樣命名為hoegh。
點選(此處)摺疊或開啟
-
SQL>
-
SQL> create user hoegh identified by hoegh
-
2 default tablespace users;
-
-
使用者已建立。
-
-
SQL>
-
SQL> grant connect,resource to hoegh;
-
-
授權成功。
-
-
SQL>
-
SQL> conn hoegh/hoegh
-
已連線。
-
SQL>
-
SQL> create table hoegh(id number,name varchar2(20));
-
-
表已建立。
-
-
SQL> insert into hoegh values(1,'hoegh');
-
-
已建立 1 行。
-
-
SQL> insert into hoegh values(10,'hoegh');
-
-
已建立 1 行。
-
-
SQL> commit;
-
-
提交完成。
-
-
SQL> select * from hoegh;
-
-
ID NAME
-
---------- --------------------
-
1 hoegh
-
10 hoegh
-
- SQL>
方法一:授予Select許可權
該方法僅針對非屬主使用者。以hoegh表為例,它的屬主使用者是hoegh,我們可以把hoegh表的select許可權賦予其他使用者,這樣其他使用者對hoegh表就是隻讀的。
點選(此處)摺疊或開啟
-
SQL>
-
SQL> grant select on hoegh to scott;
-
-
授權成功。
-
-
SQL> conn scott/tiger
-
已連線。
-
SQL> select * from hoegh.hoegh;
-
-
ID NAME
-
---------- --------------------
-
1 hoegh
-
10 hoegh
-
- SQL>
ORA-01031報錯
此時,如果我們對hoegh.hoegh表進行DML操作,系統就會報ORA-01031錯誤,提示許可權不足。
點選(此處)摺疊或開啟
-
SQL> insert into hoegh.hoegh values(100,'hoegh');
-
insert into hoegh.hoegh values(100,'hoegh')
-
*
-
第 1 行出現錯誤:
-
ORA-01031: 許可權不足
-
-
- SQL>
方法二: 觸發器
我們可以在hoegh表上建立一個觸發器,當對hoegh表執行DML操作時報錯。如下所示。
建立觸發器
點選(此處)摺疊或開啟
-
SQL> conn hoegh/hoegh
-
已連線。
-
SQL>
-
SQL> CREATE OR REPLACE TRIGGER HOEGH_TRG
-
2 BEFORE DELETE OR INSERT OR UPDATE
-
3 ON HOEGH
-
4 REFERENCING NEW AS NEW OLD AS OLD
-
5 FOR EACH ROW
-
6 DECLARE
-
7 BEGIN
-
8 RAISE_APPLICATION_ERROR (-20001, 'Table is read only table.');
-
9 END;
-
10 /
-
- 觸發器已建立
ORA-20001報錯
點選(此處)摺疊或開啟
-
SQL>
-
SQL> insert into hoegh values(100,'hoegh');
-
insert into hoegh values(100,'hoegh')
-
*
-
第 1 行出現錯誤:
-
ORA-20001: Table is read only table.
-
ORA-06512: 在 "HOEGH.HOEGH_TRG", line 3
-
ORA-04088: 觸發器 'HOEGH.HOEGH_TRG' 執行過程中出錯
-
-
- SQL>
方法三:檢查約束
我們知道對constraint的開啟和關閉共有四種:
l enable( validate) :啟用約束,建立索引,對已有及新加入的資料執行約束。
l enable novalidate :啟用約束,建立索引,僅對新加入的資料強制執行約束,而不管表中的現有資料。
l disable( novalidate):關閉約束,刪除索引,可以對約束列的資料進行修改等操作。
l disable validate :關閉約束,刪除索引,不能對錶進行 插入/更新/刪除等操作。
因此,我們可以利用disable validate來實現只讀表。
如下所示:
點選(此處)摺疊或開啟
- ALTER TABLE HOEGH ADD CONSTRAINT READ_ONLY_CONST CHECK(0=0) DISABLE VALIDATE;
ORA-25128報錯
點選(此處)摺疊或開啟
-
SQL> insert into hoegh values(100,'hoegh');
-
insert into hoegh values(100,'hoegh')
-
*
-
第 1 行出現錯誤:
-
ORA-25128: 不能對帶有禁用和驗證約束條件 (HOEGH.READ_ONLY_CONST) 的表進行插入/更新/刪除
-
-
- SQL>
方法四:只讀表空間
設定只讀表空間的主要目的是為了表空間中的靜態資料不被修改,從而能夠進行資料庫的備份和恢復等操作,還能夠保護只讀表空間中的資料不被修改。
- 設定只讀表空間的語法:ALTER TABLESPACE <表空間> READ ONLY;
- 將表空間設定為讀寫的語法:ALTER TABLESPACE <表空間> READ WRITE;
由上面建立測試使用者的語句我們得知,hoegh使用者的預設表空間是users,因此我們將users表空間設為只讀表空間。這樣,hoegh使用者下的所有表都將會是隻讀表,包括hoegh表。
如下所示。
點選(此處)摺疊或開啟
-
SQL> show user
-
USER 為 "HOEGH"
-
SQL> alter table hoegh drop constraint READ_ONLY_CONST;
-
-
表已更改。
-
-
SQL>
-
SQL> conn sys/hoegh as sysdba
-
已連線。
-
SQL>
-
SQL> alter tablespace users read only;
-
-
表空間已更改。
-
-
SQL>
-
SQL> conn hoegh/hoegh
-
已連線。
-
SQL> select * from hoegh;
-
-
ID NAME
-
---------- --------------------
-
1 hoegh
- 10 hoegh
ORA-00372& ORA-01110報錯
點選(此處)摺疊或開啟
-
SQL>
-
SQL> insert into hoegh values(100,'hoegh');
-
insert into hoegh values(100,'hoegh')
-
*
-
第 1 行出現錯誤:
-
ORA-00372: 此時無法修改檔案 4
-
ORA-01110: 資料檔案 4: 'E:\ATSTEST\USERS01.DBF'
-
-
- SQL>
DROP操作不受影響
需要注意的是,只讀表空間下是可以執行DROP操作的。
我們知道,每個資料庫在執行的時候,都至少會有一個ONLINE表空間,那就是SYSTEM表空間,其中儲存了資料字典以及PLSQL中的儲存過程、觸發器、函式、包等等資料庫物件。當進行DDL進行資料庫的刪除操作的時候,本質是是操作的SYSTEM表空間,ORACLE會在SYSTEM儲存的資料字典中,將刪除的表設定為DROP狀態,等該表空間的狀態變成READ WRITE狀態的時候,才會真正的從資料庫裡面刪除該表。
方法五: 只讀資料庫
當一個正常開啟的資料庫被設定為只讀狀態時,使用者只能查詢資料,但不能以任何方式對資料庫物件進行修改。處於只讀狀態,可能保證資料檔案和重做日誌檔案中的內容不被修改,但是並不限制那些不會寫入資料檔案與重做日誌檔案的操作。
l 設定只讀命令:alter database open read only;
l 取消只讀命令:alter database open read write;
點選(此處)摺疊或開啟
-
SQL>
-
SQL> conn sys/hoegh as sysdba
-
已連線。
-
SQL> alter tablespace users read write;
-
-
表空間已更改。
-
-
SQL>
-
SQL> shutdown immediate
-
資料庫已經關閉。
-
已經解除安裝資料庫。
-
ORACLE 例程已經關閉。
-
SQL>
-
SQL> startup mount
-
ORACLE 例程已經啟動。
-
-
Total System Global Area 1258291200 bytes
-
Fixed Size 2163712 bytes
-
Variable Size 360446976 bytes
-
Database Buffers 889192448 bytes
-
Redo Buffers 6488064 bytes
-
資料庫裝載完畢。
-
SQL>
-
SQL> alter database open read only;
-
-
資料庫已更改。
-
-
SQL>
-
SQL> conn hoegh/hoegh
-
已連線。
-
SQL>
-
SQL> select * from hoegh;
-
-
ID NAME
-
---------- --------------------
-
1 hoegh
- 10 hoegh
ORA-01552報錯
點選(此處)摺疊或開啟
-
SQL>
-
SQL> insert into hoegh values(100,'hoegh');
-
insert into hoegh values(100,'hoegh')
-
*
-
第 1 行出現錯誤:
-
ORA-01552: 非系統表空間 'USERS' 不能使用系統回退段
-
-
- SQL>
當然,這只是一個實現手段,我們肯定不會為了設定一個只讀表而將整個資料庫設定為只讀狀態。
總結
上面這幾種辦法都可以實現將一個表設定為只讀表,大家可以根據各自的具體需求選用最合適的方法。比如,最近我們一個專案為了提高資料的安全性,需要將配置資料(多張表)設定為只讀表;並且,當初為了管理方便,所有的配置資料存放到一個單獨的表空間,這樣,我就會選用只讀表空間的方法來實現這個具體需求。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29618264/viewspace-1813622/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- css 實現豎直居中的 N 種場景及 N 種方法CSS
- 生產系統中只讀表的實現思路
- 設定SQLServer資料庫中某些表為只讀的多種方法SQLServer資料庫
- mysql mysqldump只匯出表結構或只匯出資料的實現方法MySql
- 三欄佈局的n種實現
- CSS實現水平、垂直居中,N種方法,徹底說透!CSS
- javascript:讓表單文字框只讀,不可編輯的方法JavaScript
- 奇技淫巧:css實現整個表單只讀 form readonlyCSSORM
- vue實現單點登入的N種方式Vue
- Mybatis實現指定時間db只讀方案MyBatis
- 網頁元素居中的n種方法網頁
- Python單例模式(Singleton)的N種實現Python單例模式
- 實現同比、環比計算的N種姿勢
- 伺服器實現埠轉發的N種方式伺服器
- 雜湊表的兩種實現
- Python 中字串拼接的 N 種方法Python字串
- 合併JavaScript陣列的N種方法JavaScript陣列
- vsftpd的三種實現方法FTP
- 在JavaScript中判斷整型的N種方法JavaScript
- 只匯入表結構及索引的方法索引
- 報表查詢條件的 N 種使用方式
- Css實現垂直居中的幾種方法CSS
- java單例的幾種實現方法Java單例
- JavaScript實現非同步的4種方法JavaScript非同步
- android 實現拍照的2種方法Android
- CSS 實現垂直居中的 5 種方法CSS
- 實現動態表單的一種思路
- win10檔案出現只讀修改不了怎麼辦_win10檔案只讀取消不了的解決方法Win10
- js儲存常量,使其只可讀,實現方式有哪些JS
- 基於快照實現遠端資料只讀複製
- Oracle 11g RMAN恢復-只讀表空間的恢復(備份是在表空間只讀狀態下做的)Oracle
- 表單元素設定為只讀狀態
- Oracle11g新特性之只讀表Oracle
- 報表合計需求的實現方法
- ORACLE中實現表變數的方法Oracle變數
- 用sql實現的n王后SQL
- 實現單例模式的 9 種方法,你知道幾種?單例模式
- div實現水平垂直居中的幾種方法