yejf_java 发表于 2013-1-29 15:25:03

Oracle权限管理小结

/********************************************
* ORACLE 权限操作:
*      Oracle权限是非常强大的,它是一个非常庞大的系统,我们都知道Oracle是用表(系统表)来管理表(用户表)的关系型
*      数据库管理系统,在这里,我们叫系统表为 数据字典
*/
-- 写在最前面:
-- 用户介绍
sys;//系统管理员,拥有最高权限   
system;//本地管理员,次高权限   
scott;//普通用户,密码默认为tiger,10g 后版本,默认未解锁

-- 登录方法:
sqlplus / as sysdba;//登陆sys帐户   
sqlplus sys as sysdba;//同上   
sqlplus scott/tiger;//登陆普通用户scott

-- 1. 权限大致可以分为 两类, 一类是:系统权限,在 DBA_SYS_PRIVS数据字典中可以查看; 还有一类是:对像权限,如:针对表的
-- 增、删、改、查 操作,都是属于对像权限,可以通过查询 USER_TAB_PRIVS 数据字典 查看
-- 使用 SYS 登录,可以查看到 DBA_SYS_PRIVS 的结构 如下:
DESC DBA_SYS_PRIVS;

名称                                    是否为空? 类型
----------------------------------------- -------- -------------------

GRANTEE                                 NOT NULL VARCHAR2(30)
PRIVILEGE                                 NOT NULL VARCHAR2(40)
ADMIN_OPTION                                       VARCHAR2(3)

-- 使用普通用户登录,可以查看到 USER_TAB_PRIVS(用户对像权限) 和 USER_SYS_PRIVS(用户系统权限)
DESC USER_SYS_PRIVS;

Name         Type         Nullable Default Comments                        
------------ ------------ -------- ------- -------------------------------
USERNAME   VARCHAR2(30) Y                User Name or PUBLIC            
PRIVILEGE    VARCHAR2(40)                  System privilege               
ADMIN_OPTION VARCHAR2(3)Y                Grant was with the ADMIN option

DESC USER_TAB_PRIVS;

Name       Type         Nullable Default Comments                                    
---------- ------------ -------- ------- -------------------------------------------
GRANTEE    VARCHAR2(30)                  Name of the user to whom access was granted
OWNER      VARCHAR2(30)                  Owner of the object                        
TABLE_NAME VARCHAR2(30)                  Name of the object                        
GRANTOR    VARCHAR2(30)                  Name of the user who performed the grant   
PRIVILEGEVARCHAR2(40)                  Table Privilege                           
GRANTABLEVARCHAR2(3)Y                Privilege is grantable                     
HIERARCHYVARCHAR2(3)Y                Privilege is with hierarchy option      

-- 2. 创建用户
create user a identified by a default tablespace users;-- 创建一个用户
grant connect,resourct to a;-- 授与 角色,角色中含有 系统权限,我们下面会看到

-- 3. 查看角色, 通过 数据字典 DBA_ROLES, 可以得到各个角色
DESC DBA_ROLES;

Name            Type         Nullable Default Comments                                                
----------------- ------------ -------- ------- -------------------------------------------------------
ROLE            VARCHAR2(30)                  Role Name                                             
PASSWORD_REQUIRED VARCHAR2(8)Y                Indicates if the role requires a password to be enabled

-- 4. 查看各角色的权限,可以通过数据字典 ROLE_SYS_PRIVS 数据字典 来查看
DESC ROLE_SYS_PRIVS;

Name         Type         Nullable Default Comments                        
------------ ------------ -------- ------- -------------------------------
ROLE         VARCHAR2(30)                  Role name                     
PRIVILEGE    VARCHAR2(40)                  System Privilege               
ADMIN_OPTION VARCHAR2(3)Y                Grant was with the ADMIN option

-- 4.1 我们可以查看系统创建的角色 resource 的各种权限
select role,privilege from ROLE_SYS_PRIVS where role = 'RESOURCE';

ROLE                           PRIVILEGE
------------------------------ ----------------------------------------
RESOURCE                     CREATE SEQUENCE
RESOURCE                     CREATE TRIGGER
RESOURCE                     CREATE CLUSTER
RESOURCE                     CREATE PROCEDURE
RESOURCE                     CREATE TYPE
RESOURCE                     CREATE OPERATOR
RESOURCE                     CREATE TABLE
RESOURCE                     CREATE INDEXTYPE

8 rows selected

-- 从以上输出,我们可以看出,角色 resource 拥有 8个系统权限,如上;
-- 这里我们要注意一点,细心的人可能会发现,当我们创建好一个用户,授与 resource 角色给到用户时,
-- 我们查看这个用户的系统权限时,会发现多出一个 UNLIMITED TABLESPACE的权限,如我们第2步创
-- 建的用户a
conn a/a
select * from user_sys_privs;

USERNAME                     PRIVILEGE                              ADMIN_OPTION
------------------------------ ---------------------------------------- ------------
A                              CREATE SESSION                           NO
A                              UNLIMITED TABLESPACE                     NO

-- 你会看到,第2行有一个 UNLIMITED TABLESPACE 的系统权限.
-- 针对这个 UNLIMITED TABLESPACE权限,它是表示可以在任易表空间下申请空间。 这个系统权限很
-- 特别,它属于 resource 角色,但是,我们查数据字典时看不见。严格来说,我们不能 把这个 权限
-- 授与任何我们自己创建的 角色。所以, 在数据字典中,我们查不到它。请记住就行。

-- 5. 创建 角色 和 授与 角色系统权限
create role mytestrole ; -- 创建角色,名为:mytestrole
grant create table,create procedure,create sequence to mytestrole; -- 授与权限给角色

-- 5.1 我们可以查询数据字典来看到此权限。
select * from role_sys_privs where role = 'MYTESTROLE';

ROLE                           PRIVILEGE                              ADMIN_OPTION
------------------------------ ---------------------------------------- ------------
MYTESTROLE                     CREATE TABLE                           NO
MYTESTROLE                     CREATE SEQUENCE                        NO
MYTESTROLE                     CREATE PROCEDURE                         NO

-- 6. 授权
/*管理员授权, 注:授系统权限时,只能是DBA ,授对像权限时,对像拥有者就可以 */   
-- 下面是 DBA 授予系统权限的例子:
grant create session to sodi; -- 授予sodi用户创建session的权限,即登陆权限   
grant unlimited session to sodi; -- 授予sodi用户使用表空间的权限   
grant create table to sodi; -- 授予创建表的权限   
grante drop table to sodi; -- 授予删除表的权限   
grant insert table to sodi; -- 插入表的权限   
grant update table to sodi; -- 修改表的权限   
grant all to public; --这条比较重要,授予所有权限(all)给所有用户(public)


-- 下面是授予对像权限的例子, 其中 tablename是指表名
/* oralce对权限管理比较严谨,普通用户之间也是默认不能互相访问的 */   
grant select on tablename to sodi; -- 授予 sodi 用户查看指定表的权限   
grant drop on tablename to sodi; -- 授予删除表的权限   
grant insert on tablename to sodi; -- 授予插入的权限   
grant update on tablename to sodi; -- 授予修改表的权限   
grant insert(id) on tablename to sodi; -- 授予对指定表特定字段的插入和修改权限,注意,只能是insert和update         
grant update(id) on tablename to sodi; -- 授予对指定表特定字段的插入和修改权限,注意,只能是insert和update   
grant alert all table to sodi; -- 授予sodi用户alert任意表的权限   

-- 7. 撤销权限
/* 使用 revoke 命令,使用时同 grant 一致 */
revoke create session from sodi;--撤消对 sodi用户 create session的权限
revoke insert on tablename from sodi; -- 撤消插入的权限

-- 8. 权限传递
/***********************************************************
* 通过 with admin option 选项和 with grant option 选项,二者异同点:
* 1. 相同点:
*    两者 都可以用户给 用户授权或者 给 角色授权上。
*    grant create table to a with admin option;
      grant select on tablename to b with grant option;
      
* 2. 不同点:
      with admin option 只能用在授予 系统权限上
      with grant option 只能用户授予 对像权限上
      当DBA把系统权限create table 授予了用户 a 时,并且指定了 with admin option
如:grant create table to a with admin option
      此时,用户a可以创建表,并且还可以把 create table 权限授予 用户 b, 这就是 权限传递
再如:grant select on tablename to a with grant option
      此时,用户a可以查询表tablename,而且用户a还可以把权限授予用户b,并且b也可以访问tablename
不过,要注意的是:当权限回收时,with grant option会传递回收;而with admin option则不会
*/
-- 例:
grant create table to a with admin option;
grant select on tablename to b with grant option;
-- 切换成用户b
select * from a.tablename;-- 可以有权限查询
-- 再授权给用户c
grant select on a.tablename to c; -- 由于上面有了 with grant option,则此语句成功
-- 切换成用户 c
select * from a.tablename; -- success.
-- 可以再测试一下,回收。
页: [1]
查看完整版本: Oracle权限管理小结