關於許可權設定的一個小把戲(r2第27天)
阿新 • • 發佈:2022-05-04
現在有一個需求,需要開放一些"特殊“的許可權給開發組。
具體的背景是這樣的:
有三個資料庫使用者,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.
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
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
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 的情況。