將指定用戶下所有表的查詢權限賦權給查詢用戶[轉]
-----------------------------------------------2013/11/1
oracle的開發和管理往往都是分開的,當然不否認這種"集萬千寵愛於一身"的人才也大有人在,但是在公司,往往開發人員兼顧程序和數據庫的設計與開發,而oracle dba則是負責oracle的安全與維護。那么這就出現了一個問題,權限問題,不是所有人都可以有dba權限的,這樣很容易造成不安全的隱患。所以要合理的分配用戶和權限。 以下舉例說明:
一、創建了一個查詢用戶rptuser,該用戶具有scott(根據公司具體要求替換用戶)用戶下所有表的查詢權限。
注意:如果只是把scott用戶下emp表的select權限賦權給rptuser,那么很簡單,直接在dba用戶下執行grant select on scott.emp to rptuser;即可,那是因為僅此一條語句,所以可以直接賦權,若是要求將一個具有幾千幾萬張表的用戶(此時若不是scott用戶只有9張表)下的所有表賦權給一個查詢用戶,那豈不是悲劇了?
稍安勿躁,下面有請"絕招"上場,大家鼓掌歡迎~~吼吼
二、兩種方式:此處我采用方法二列舉過程
1.select 'grant select on '|| tname ||' to rptuser ;' from tab;
(當前用戶有dba權限如system或者sysdba,執行輸出腳本)
2.select 'grant select on user.' || tname || ' to rptuser;' from tab;
(當前用戶無dba權限也就是scott用戶,用system或者sysdba用戶執行輸出腳本)
輸出內容為:
-
grant select on DEPT to rptuser ;
-
grant select on EMP to rptuser ;
-
grant select on BONUS to rptuser ;
-
grant select on SALGRADE to rptuser ;
-
grant select on AVGSAL to rptuser ;
-
grant select on BOOK to rptuser ;
-
grant select on TEST_INDEX to rptuser ;
-
grant select on TB_EMPLOYEES to rptuser ;
三、直接復制此內容使用system用戶執行即可,這里我使用的是oracle的客戶端Toad for oracle,執行結果如下:

賦權執行成功。
四、再用具有dba權限的用戶給rptuser用戶賦予建同義詞的權限
grant create synonym to rptuser;
五、再在scott用戶下執行
select 'create synonym ' || tname || ' for scott.' || tname || ';' from tab;
或者
select 'create synonym '|| table_name || ' for scott.' || table_name || ';' from user_tables;
輸出腳本內容為:
-
create synonym DEPT for scott.DEPT;
-
create synonym EMP for scott.EMP;
-
create synonym BONUS for scott.BONUS;
-
create synonym SALGRADE for scott.SALGRADE;
-
create synonym BOOK for scott.BOOK;
-
create synonym TB_EMPLOYEES for scott.TB_EMPLOYEES;
-
create synonym TEST_INDEX for scott.TEST_INDEX;
六、最后將這個腳本內容用rptuser查詢用戶執行,完成
七、用rptuser用戶查詢scott用戶下的表,即無需from scott.tablename了,可以直接查詢了
-
SQL> show user;
-
USER is "RPTUSER"
-
SQL> select * from dept;
-
DEPTNO DNAME LOC
-
-
10 ACCOUNTING NEW YORK
-
20 RESEARCH DALLAS
-
30 SALES CHICAGO
-
40 OPERATIONS BOSTON
總結:這種辦法的好處就是可以使dba簡化繁瑣的工作,若是一張一張表的賦權,那么要是遇到一個用戶幾千張,不,估計幾十張,你就得瘋了,所以采用此方法。
舉一反三:如果賦權給查詢用戶sequence的查詢權限也是一樣,我想大家都看得明白了,僅給出語句,過程就不寫了,呵呵。
select 'grant select on ' || sequence_name || ' to itreport;' from dba_sequences where sequence_owner='USER_NAME';
注意兩點:1.此處應該用具有dba權限的用戶執行此語句
2.紅色部分USER_NAME為具體用戶名
其他過程如上所述,此處省略十分鍾的口水。。。。