第十七章:  权限管理

1、权限(privilege):system privilege   and  object privilege

   1) system privilege:针对于database 的相关权限
   2) object privilege:针对于schema 的object
  
2、 查看系统权限
 10:55:12 SQL> desc system_privilege_map;                                                                                                
 Name                                                              Null?    Type
 ----------------------------------------------------------------- -------- --------------------------------------------
 PRIVILEGE                                                         NOT NULL NUMBER
 NAME                                                              NOT NULL VARCHAR2(40)
 PROPERTY                                                          NOT NULL NUMBER

10:55:41 SQL> select * from system_privilege_map;                                                                                       

 PRIVILEGE NAME                                       PROPERTY
---------- ---------------------------------------- ----------
        -3 ALTER SYSTEM                                      0
        -4 AUDIT SYSTEM                                      0
        -5 CREATE SESSION                                    0
        -6 ALTER SESSION                                     0
        -7 RESTRICTED SESSION                                0
       -10 CREATE TABLESPACE                                 0
       -11 ALTER TABLESPACE                                  0
       -12 MANAGE TABLESPACE                                 0
       -13 DROP TABLESPACE                                   0
       -15 UNLIMITED TABLESPACE                              0
      
       。。。。。。
       -280 CREATE EXTERNAL JOB                               0

166 rows selected.

  -------select any table  访问dba_xxx数据字典视图
 
10:55:49 SQL> grant select any table to scott;                                                                                          

Grant succeeded.

10:57:59 SQL> conn scott/tiger                                                                                                          
Connected.
10:58:03 SQL>
10:58:03 SQL> desc user_sys_privs;                                                                                                      
 Name                                                              Null?    Type
 ----------------------------------------------------------------- -------- --------------------------------------------
 USERNAME                                                                   VARCHAR2(30)
 PRIVILEGE                                                         NOT NULL VARCHAR2(40)
 ADMIN_OPTION                                                               VARCHAR2(3)

10:58:13 SQL> select * from user_sys_privs;                                                                                             

USERNAME                       PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
SCOTT                          UNLIMITED TABLESPACE                     NO
SCOTT                          SELECT ANY TABLE                         NO

10:58:20 SQL> select * from tom.t01;                                                                                                    

        ID
----------
         1
         2
         3

10:58:29 SQL> select * from sys.dba_users;                                                                                              
select * from sys.dba_users
                  *
ERROR at line 1:
ORA-00942: table or view does not exist


10:58:38 SQL>

---------默认普通用户不能去访问dba_xxx 视图,需要修改以下参数

11:00:23 SQL> show parameter o7                                                                                                         

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
O7_DICTIONARY_ACCESSIBILITY          boolean     FALSE

11:00:44 SQL> alter system set O7_DICTIONARY_ACCESSIBILITY=true scope=spfile;                                                           

System altered.

11:00:48 SQL> startup force                                                                                                             
ORACLE instance started.

Total System Global Area  167772160 bytes
Fixed Size                  1218316 bytes
Variable Size              83888372 bytes
Database Buffers           79691776 bytes
Redo Buffers                2973696 bytes
Database mounted.
Database opened.
11:01:03 SQL> conn scott/tiger                                                                                                          
Connected.

 

11:02:12 SQL> select TABLE_NAME from dba_tables where owner='SCOTT';                                                                    

TABLE_NAME
------------------------------
EMPLOYEES
TEST
DEPT
EMP
BONUS
SALGRADE
EMP1
EXCEPTIONS
DEPT1
ADMIN_EXT_EMPLOYEES

10 rows selected

3、分配、回收系统权限
   grant  ---------with admin option  (如果用户获得权限时,设置此参数,用户可以将权限再授予别的用户)
  
   11:06:55 SQL> grant select any table to scott with admin option;                                                                        

Grant succeeded.

11:07:05 SQL> conn scott/tiger                                                                                                          
Connected.
11:07:08 SQL>
11:07:08 SQL> select * from user_sys_privs;                                                                                             

USERNAME                       PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
SCOTT                          UNLIMITED TABLESPACE                     NO
SCOTT                          SELECT ANY TABLE                         YES

11:07:17 SQL> grant select any table to tom;                                                                                            

Grant succeeded.

11:07:22 SQL> conn tom/tom                                                                                                              
Connected.
11:07:26 SQL>
11:07:26 SQL> select * from user_sys_privs;                                                                                             

USERNAME                       PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
TOM                            CREATE TABLE                             NO
TOM                            SELECT ANY TABLE                         NO
TOM                            CREATE SESSION                           NO

11:07:30 SQL> select * from scott.emp where rownum <3;                                                                                  

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 17-DEC-80        800                    20
      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30

  -------------- revoke          with admin option ,在回收权限时,不能级联。
  11:07:44 SQL> conn /as sysdba                                                                                                           
Connected.
11:07:51 SQL>
11:07:51 SQL> revoke select any table from scott;                                                                                       

Revoke succeeded.

11:08:02 SQL> conn scott/tiger                                                                                                          
Connected.
11:08:10 SQL>
11:08:10 SQL> select * from user_sys_privs;                                                                                             

USERNAME                       PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
SCOTT                          UNLIMITED TABLESPACE                     NO

11:08:14 SQL> conn tom/tom                                                                                                              
Connected.
11:08:18 SQL>
11:08:18 SQL> select * from user_sys_privs;                                                                                             

USERNAME                       PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
TOM                            CREATE TABLE                             NO
TOM                            SELECT ANY TABLE                         NO
TOM                            CREATE SESSION                           NO

11:08:20 SQL>

----------必须一一收回

11:09:01 SQL> revoke select any table from tom;                                                                                         

Revoke succeeded.

11:09:11 SQL> conn tom/tom                                                                                                              
Connected.
11:09:14 SQL>
11:09:14 SQL> select * from user_sys_privs;                                                                                             

USERNAME                       PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
TOM                            CREATE TABLE                             NO
TOM                            CREATE SESSION                           NO

11:09:18 SQL>
 
 
 4、对象权限
 grant  ---------with grant option  (如果用户获得权限时,设置此参数,用户可以将权限再授予别的用户)
11:15:51 SQL> grant all on scott.emp to public;

  ----all 代表所有的对象权限,public 代表所有的用户
 
11:16:01 SQL> conn tom/tom                                                                                                              
Connected.
11:16:51 SQL>                                                                                                                         
  1* select * from user_tab_privs

GRANTEE              OWNER      TABLE_NAME GRANTOR    PRIVILEGE                                GRA HIE
-------------------- ---------- ---------- ---------- ---------------------------------------- --- ---
TOM                  SCOTT      EMP        SCOTT      SELECT                                   NO  NO

11:16:53 SQL> delete from scott.emp;                                                                                                    

14 rows deleted.

11:17:53 SQL> rollback;                                                                                                                 

Rollback complete.

11:18:00 SQL
11:18:33 SQL> revoke all on scott.emp from public;                                                                                      

Revoke succeeded.
11:19:16 SQL> conn /as sysdba                                                                                                           
Connected.
11:19:22 SQL>
11:19:22 SQL> grant update on scott.emp to tom with grant option;                                                                       

Grant succeeded.
11:19:45 SQL> create user rose identified by rose ;                                                                                     

User created.

11:20:04 SQL> grant create session to rose;                                                                                             

Grant succeeded.

11:20:13 SQL> conn tom/tom                                                                                                              
Connected.
11:20:16 SQL>
11:20:16 SQL> select * from user_tab_privs;                                                                                             

GRANTEE              OWNER      TABLE_NAME GRANTOR    PRIVILEGE                                GRA HIE
-------------------- ---------- ---------- ---------- ---------------------------------------- --- ---
TOM                  SCOTT      EMP        SCOTT      UPDATE                                   YES NO
TOM                  SCOTT      EMP        SCOTT      SELECT                                   NO  NO

11:20:32 SQL> grant update on scott.emp to rose;                                                                                        

Grant succeeded.

11:20:46 SQL> conn rose/rose                                                                                                            
Connected.
11:20:50 SQL>
11:20:50 SQL> select * from user_tab_privs;                                                                                             

GRANTEE              OWNER      TABLE_NAME GRANTOR    PRIVILEGE                                GRA HIE
-------------------- ---------- ---------- ---------- ---------------------------------------- --- ---
ROSE                 SCOTT      EMP        TOM        UPDATE                                   NO  NO

 
 -------------- revoke          with grant option ,在回收权限时,级联。
 11:20:54 SQL> conn /as sysdba                                                                                                           
Connected.
11:21:00 SQL>
11:21:00 SQL> revoke update on scott.emp from rose;                                                                                     
revoke update on scott.emp from rose
*
ERROR at line 1:
ORA-01927: cannot REVOKE privileges you did not grant

----只能从直接授予者回收权限

11:21:14 SQL> revoke update on scott.emp from tom;                                                                                      

Revoke succeeded.

11:21:22 SQL> conn tom/tom                                                                                                              
Connected.
11:21:25 SQL>
11:21:25 SQL> select * from user_tab_privs;                                                                                             

GRANTEE              OWNER      TABLE_NAME GRANTOR    PRIVILEGE                                GRA HIE
-------------------- ---------- ---------- ---------- ---------------------------------------- --- ---
TOM                  SCOTT      EMP        SCOTT      SELECT                                   NO  NO


--------针对列授予对象权限

11:24:05 SQL> grant update(sal) on scott.emp to tom;                                                                                    

Grant succeeded.

11:29:39 SQL> conn tom/tom                                                                                                              
Connected.
11:29:51 SQL>
11:29:51 SQL> update scott.emp set comm=100 where empno=7788;                                                                           
update scott.emp set comm=100 where empno=7788
             *
ERROR at line 1:
ORA-01031: insufficient privileges


11:29:53 SQL> update scott.emp set sal=10000 where empno=7788;                                                                          

1 row updated.

11:30:01 SQL> rollback;                                                                                                                 

Rollback complete.

11:30:54 SQL>                                                                                                                      
  1* select GRANTEE,table_name,COLUMN_NAME,PRIVILEGE from user_col_privs

GRANTEE                        TABLE_NAME COLUMN_NAME                    PRIVILEGE
------------------------------ ---------- ------------------------------ ----------------------------------------
TOM                            EMP        SAL                            UPDATE

11:30:54 SQL>


视图:

显示用户授出的列权限
04:47:57 SQL>
  1   select grantee,privilege,table_name||'.'||column_name
  2    tab_column
  3*     from user_col_privs_made;

4)显示用户所具有的列权限(收到)
select privilege,table_name||'.'||column_name tab_column,
04:49:38   2    grantor
04:49:43   3      from all_col_privs_recd
04:49:53   4       where grantee='HR';

no rows selected


显示用户所授出的对象权限
04:42:47 SQL> col table_name for a10for a10
04:51:19 SQL> select grantee ,privilege ,table_name
04:51:34   2    from user_tab_privs_made;

GRANTEE                        PRIVILEGE                                TABLE_NAME
------------------------------ ---------------------------------------- ----------
HR                             DELETE                                   DEPT
HR                             SELECT                                   DEPT
HR                             UPDATE                                   DEPT
OE                             SELECT                                   EMP

显示用户所具有的对象权限(收到)
04:52:45 SQL> select privilege,table_name,grantor
04:52:58   2    from all_tab_privs_recd
04:53:10   3      where grantee='HR';

PRIVILEGE                                TABLE_NAME GRANTOR
---------------------------------------- ---------- ------------------------------
EXECUTE                                  DBMS_STATS SYS
DELETE                                   DEPT       SCOTT
SELECT                                   DEPT       SCOTT
UPDATE                                   DEPT       SCOT