關於許可權設定的一個小把戲

dbhelper發表於2014-11-26
現在有一個需求,需要開放一些"特殊“的許可權給開發組。
具體的背景是這樣的:
有三個資料庫使用者,tabowner, tabconn, tab_temp三個使用者
tableowner是owner使用者,裡面存放著表,索引,序列,儲存過程等。
tabconn是一個連線使用者,在這個使用者裡面建立了一些同義詞,可以直接透過這個使用者來進行資料的增刪改查。
tab_temp是一個臨時的連線使用者,透過這個使用者只能查詢一些有限的資訊,不能進行資料的改動。而且不能執行select sequence_name.nextval from dual這樣型別的語句,避免人為干擾sequence的增長。

現在的問題是,因為沒有開放select on sequence的許可權給tab_temp,所以透過tab_temp無法查詢到tabowner裡的sequence資訊。
舉個簡單的例子。
--tabowner建立一個檢視,從user_sequence裡面查詢當前schema中的sequence資訊,得到的結果是實時的。
SQL> create view a as select *from user_sequences;
View created.
--裡面有198條記錄
SQL> select count(*)from a;
  COUNT(*)
----------
       198
如果我嘗試把檢視訪問的許可權賦予tabconn,那麼是否可以透過tabconn訪問到tabowner中的user_sequences資訊呢?
SQL> grant select on a to tabconn;
Grant succeeded.

SQL> conn tabconn/tabconn
Connected.

SQL> select count(*)from tabowner.a;
  COUNT(*)
----------
         0
可以看到,這樣是行不通的         

不過可以做一個小把戲,使得許可權的訪問可以選擇性的開放。透過dblink
目前tabconn可以訪問all_sequences的資訊,裡面包含tabowner裡的sequence資訊
可以在tab_temp下建立一個db link,然後透過這個db link來做一些工作。
SQL> conn tab_temp/tab_temp
Connected.
SQL> 
SQL> create database link temp_link connect to tabconn identified by tabconnusing 'TESTDB';
Database link created.

SQL> select count(*)from all_sequences@temp_link;
  COUNT(*)
----------
       230

可以看到能夠查到資料了,不過如果足夠細心的話,發現結果好像多了一點,按照我們的要求,指定查詢的是tabowner下的sequence資訊。
SQL>  select count(*)  from all_sequences@temp_link where sequence_owner='TABOWNER'
  2  /
  COUNT(*)
----------
       197
這樣就沒有問題了。
建立檢視
create view sequence_summary_v as select *from all_sequences@temp_link where sequence_owner='TABOWNER';

直接暴露檢視也不太好,可以透過同義詞來進行遮蔽
SQL> select count(*)from sequence_summary;
  COUNT(*)
----------
       197
SQL>  create synonym sequence_summary for sequence_summary_v;
Synonym created.
這樣對於開發來說,就能夠查到實時的sequence資訊了。而且也能夠杜絕增長/修改sequence value 的情況。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8494287/viewspace-1347104/,如需轉載,請註明出處,否則將追究法律責任。

相關文章