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';
select 'grant select on ' || sequence_name || ' to itreport;' from dba_sequences where sequence_owner='USER_NAME';
注意兩點:1.此處應該用具有dba權限的用戶執行此語句
2.紅色部分USER_NAME爲具體用戶名
其他過程如上所述,此處省略十分鐘的口水。。。。