oracle——將指定用戶下所有表的查詢權限賦權給查詢用戶

    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用戶執行輸出腳本)
輸出內容爲:

  1. grant select on DEPT to  rptuser ; 
  2. grant select on EMP to  rptuser ; 
  3. grant select on BONUS to  rptuser ; 
  4. grant select on SALGRADE to  rptuser ; 
  5. grant select on AVGSAL to  rptuser ; 
  6. grant select on BOOK to  rptuser ; 
  7. grant select on TEST_INDEX to  rptuser ;  
  8. 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;
輸出腳本內容爲:
 
  1. create synonym DEPT for scott.DEPT; 
  2. create synonym EMP for scott.EMP; 
  3. create synonym BONUS for scott.BONUS; 
  4. create synonym SALGRADE for scott.SALGRADE; 
  5. create synonym BOOK for scott.BOOK; 
  6. create synonym TB_EMPLOYEES for scott.TB_EMPLOYEES; 
  7. create synonym TEST_INDEX for scott.TEST_INDEX; 
六、最後將這個腳本內容用rptuser查詢用戶執行,完成
七、用rptuser用戶查詢scott用戶下的表,即無需from scott.tablename了,可以直接查詢了
 
  1. SQL> show user;
  2. USER is "RPTUSER"
  3. SQL> select * from dept; 
  4.     DEPTNO DNAME          LOC 
  5. ---------- -------------- ------------- 
  6.         10 ACCOUNTING     NEW YORK 
  7.         20 RESEARCH       DALLAS 
  8.         30 SALES          CHICAGO 
  9.         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爲具體用戶名
   其他過程如上所述,此處省略十分鐘的口水。。。。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章