【SCRIPTS】將使用者具有的所有許可權盡收眼底

secooler發表於2009-11-18
如何快速的在SQL*Plus中獲得特定使用者所具有的所有許可權?
針對這個常見的問題我今天編寫了一段簡單指令碼,供大家參考(當然您也可以在此基礎上做進一步的改動,把它變成自己的一個小武器)。

1.Oracle資料庫中與許可權相關的檢視
dba_role_privs:檢視角色
dba_sys_privs :檢視系統許可權
dba_tab_privs :檢視物件許可權
dba_col_privs :檢視列物件許可權

2.指令碼編寫思想
我們使用union將以上許可權相關的檢視檢視結果連線起來便會得到使用者的所有許可權。

思想有多遠,我們就能走多遠。指令碼編寫進行時……

3.指令碼橫空出世
經過除錯,指令碼內容如下。
$ cat privs.sql
set verify off
set linesize 131
col grantee for a15
col privilege for a30
col column_name for a15
col owner for a20

SELECT 'ROLE' TYPE,
       grantee,
       granted_role privilege,
       admin_option ad,
       '/' table_name,
       '/' column_name,
       '/' owner
  FROM dba_role_privs
 WHERE grantee = UPPER ('&1')
UNION
SELECT 'SYSTEM' TYPE,
       grantee,
       privilege privilege,
       admin_option ad,
       '/' table_name,
       '/' column_name,
       '/' owner
  FROM dba_sys_privs
 WHERE grantee = UPPER ('&1')
UNION
SELECT 'TABLE' TYPE,
       grantee,
       privilege privilege,
       grantable ad,
       table_name,
       '/' column_name,
       owner
  FROM dba_tab_privs
 WHERE grantee = UPPER ('&1')
UNION
SELECT 'COLUMN' TYPE,
       grantee,
       privilege privilege,
       grantable ad,
       table_name,
       column_name,
       owner
  FROM dba_col_privs
 WHERE grantee = UPPER ('&1')
ORDER BY 1
/

undefine 1
set verify on


4.指令碼使用演示
最後,詳細演示一下這個指令碼的使用。
1)建立測試使用者sec
SQL> drop user sec cascade;

User dropped.

SQL> create user sec identified by sec default tablespace TBS_SEC_D;

User created.

2)給sec使用者授予connect角色
SQL> grant connect to sec;

Grant succeeded.

3)給sec使用者授予物件許可權
SQL> grant select on secooler.t to sec;

Grant succeeded.

4)給sec使用者授予系統“select any table”許可權
SQL> grant select any table to sec;

Grant succeeded.

5)授予sec使用者列物件許可權
SQL> grant insert(x), update(x) on secooler.t to sec;

Grant succeeded.

6)使用指令碼檢視一下效果,是不是感覺清晰了許多。
SQL> @privs sec

TYPE   GRANTEE  PRIVILEGE         AD  TABLE_NAME  COLUMN_NAME  OWNER
------ -------- ----------------- --- ----------- ------------ --------
COLUMN SEC      INSERT            NO  T           X            SECOOLER
COLUMN SEC      UPDATE            NO  T           X            SECOOLER
ROLE   SEC      CONNECT           NO  /           /            /
SYSTEM SEC      SELECT ANY TABLE  NO  /           /            /
TABLE  SEC      SELECT            NO  T           /            SECOOLER

上面得到的資訊與我們授權內容是完全相符。

5.小結
很多常見的問題都可以使用SQL指令碼來處理之,這樣既可以防止出錯,也可以大大的減少問題分析和處理的時間,延長DBA的生命。

Good luck.

-- The End --

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-619979/,如需轉載,請註明出處,否則將追究法律責任。

相關文章