1. 程式人生 > 其它 >關於許可權設定的一個小把戲(r2第27天)

關於許可權設定的一個小把戲(r2第27天)

現在有一個需求,需要開放一些"特殊“的許可權給開發組。 具體的背景是這樣的: 有三個資料庫使用者,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 的情況。