Maison >base de données >tutoriel mysql >ORACLE权限管理调研笔记
在默认的方式下,任何非授权用户都不能在ORACLE执行任何操作,且默认情况下,只有SYSTEM和SYS能给其他用户授予权限。 ORACLE的用户权限分为系统权限(SYSTEMPRIVILEGE)和对象权限(OBJECTPRIVILEGE)。 *系统权限控制了对数据字典的修改。 * 对象权限控制了
在默认的方式下,任何非授权用户都不能在ORACLE执行任何操作,且默认情况下,只有SYSTEM和SYS能给其他用户授予权限。
ORACLE的用户权限分为系统权限(SYSTEMPRIVILEGE)和对象权限(OBJECTPRIVILEGE)。
* 系统权限控制了对数据字典的修改。
* 对象权限控制了对数据的修改。
系统权限通常是针对修改表数据字典、修改数据库实例的情况进行控制。例如创建用户、创建表空间、控制会话等。
其中权限部分可以有两种选择,分别是:
· 权限:system_privilete和ALL PRIVILEGE
· 角色:role
对于(被授权人)grantee_clause处,也有两种选择:
· 用户:user和PUBLIC
· 角色:role
所以对于系统权限来说,语法实现上主要可以有四种情况:
1. 权限 –> 用户
GRANT privileges[,privilege…] TO username [WITH ADMIN OPTION];
分配权限(PRIVILEGE)给用户(USERNAME)。如果权限是ALL PRIVILEGES,在USER_SYS_PRIVS会显示多行,每个权限一行,另外,username可以是PUBLIC。
对应的系统视图为:DBA_SYS_PRIVS,USER_SYS_PRIVS。
SQL> grant create any table to test2; 授权成功。
SQL> select * from sysauth$ where sequence# >= 1273 GRANTEE# PRIVILEGE# SEQUENCE# OPTION$ ---------- ---------- ---------- ---------- 88 92 1273 1 89 -41 1291 SQL> select * from system_privilege_map where privilege=-41;
PRIVILEGE NAME PROPERTY ---------- ---------------------------------------- ---------- -41 CREATE ANY TABLE 0 |
2. 权限 –> 角色
GRANT privilege[,privilege…]TO role [WITH ADMIN OPTION];
分配系统权限(PRIVILEGE)给一个角色(ROLE)。
对应的系统视图:ROLE_SYS_PRIVS。
SQL> create role role1; 角色已创建。
SQL> grant create any table to role1 with admin option; 授权成功。
SQL> select name, option$,grantee# from sysauth$,system_privilege_map where priv ilege = privilege# and sequence# >= 1274;
NAME OPTION$ GRANTEE# ---------------------------------------- ---------- ---------- CREATE ANY TABLE 1 94
|
3. 角色 -> 角色
GRANT role TO role [WITH ADMIN OPTION];
给一个角色(ROLE)授予另一个角色的权限。
对应的系统视图:ROLE_ROLE_PRIVS。
SQL> create role role1; 角色已创建。
SQL> create role role2; 角色已创建。
SQL> grant role1 to role2 with admin option; 授权成功。
SQL> select * from role_role_privs where role='ROLE2';
ROLE GRANTED_ROLE ADM ------------------------------ ------------------------------ --- ROLE2 ROLE1 YES
|
4. 角色 –> 用户
GRANT role TO username[WITH ADMINOPTION];
分配角色(ROLE)给用户(USERNAME),username可以是public。
对应的系统视图为:USER_ROLE_PRIVS。
SQL> create user test1 identified by 123456; 用户已创建。
SQL> grant role1 to test1 with admin option; 授权成功。
SQL> select * from dba_role_privs where grantee='TEST1';
GRANTEE GRANTED_ROLE ADM DEF ------------------------------ ------------------------------ --- --- TEST1 ROLE1 YES YES |
ANY:系统权限使用ANY关键字来给数据库下的所有对象赋予权限,使用ANY关键字赋予权限后,对象的访问权限不仅限于自身所在的SCHEMA,可以跨SCHEMA进行操作。
ANY: System privileges thatuse the <span>ANY</span>
keywordenable
you to set privileges for an entire category of objects in the database. The behavior of an object created byusers with the <span>ANY</span>
privilegeis
not restricted to the schema in which it was created.
PUBLIC:PUBLIC是一种系统内置的角色,对PUBLIC赋予的权限,系统内的所用用户都可以获得。
PUBLIC:You can grant privileges to the <span>PUBLIC</span>
role,which
then makes the privileges available to every user in the Oracle database.
系统权限使用WITH ADMIN OPTION来制定被授权用户是否可以把获取到的权限转授给他人。
当权限回收时,转授他人的权限不会回收,不存在级联回收的情况。
能够授予和回收系统权限的用户包含以下两类:
l 通过WITH ADMIN OPTION获得权限的用户。
l 有GRANT ANY PRIVILEGE权限的用户。
对象权限主要应用在表、视图、序列这些对象上。
l 在ORACLE中对应的主要的系统视图是:ALL_TAB_PRIVS、DBA_TAB_PRIVS、USER_TAB_PRIVS和ROLE_TAB_PRIVS。
l 对于设置了列权限的情况,对应的系统视图为:ALL_COL_PRIVS、USER_COL_PRIVS。
首先创建两个用户user1和user2,并且分别授予CREATE SESSION权限,对USER1授予CREATE TABLE系统权限。
这时,user2是不能访问user1创建的表:
SQL> select * from user1.test; select * from user1.test * 第 1 行出现错误: ORA-00942: 表或视图不存在 |
通过授予对象权限,可以实现授权:
SQL> grant select on user1.test to user2 with grant option; 授权成功。 SQL> select * from dba_tab_privs where grantee='USER2';
GRANTEE OWNER ------------------------------ ------------------------------ TABLE_NAME GRANTOR ------------------------------ ------------------------------ PRIVILEGE GRA HIE ---------------------------------------- --- --- USER2 USER1 TEST USER1 SELECT YES NO |
并且授权后,能访问grantor表:
SQL> select * from user1.test;
A ---------- 2 |
对象 |
权限 |
DIRECTORY |
READ、WRITE、EXECUTE |
EDITION |
USE |
INDEXTYPE |
EXECUTE |
FLASHBACK DATA ARCHIVE |
FLASHBACK ARCHIVE |
LIBRARY |
EXECUTE |
MATERIALIZED VIEW |
ON COMMIT REFRESH、QUERY REWRITE、SELECT |
MINING MODEL |
ALTER 、SELECT |
OBJECT TYPE |
DEBUG 、EXECUTE、UNDER |
OLAP |
INSERT、ALTER、DELETE、SELECT、UPDATE |
OPERATOR |
EXECUTE、DEBUG 、EXECUTE |
SCHEDULER |
EXECUTE、ALTER |
SEQUENCE |
ALTER 、SELECT |
SYNONYM |
和目标项权限相同 |
TABLE |
ALTER 、DEBUG、DELETE 、INDEX 、INSERT 、REFERENCES、 SELECT 、UPDATE |
VIEW |
DEBUG、DELETE 、INSERT 、MERGE VIEW、REFERENCES、SELECT 、UNDER、UPDATE |
|
|
按照ORACLE文档,去掉重复,对象权限主要包含如下18个权限:READ、WRITE、EXECUTE、USE、FLASHBACKARCHIVE、ON COMMITREFRESH、QUERY REWRITE、SELECT、ALTER 、DEBUG 、UNDER、INSERT、DELETE、UPDATE、INDEX 、REFERENCES 、UPDATE、MERGE VIEW。
在TABLE_PRIVILEGE_MAP中的对象权限会多于上述的数量,有26个,除了上述的权限外,还有AUDIT、COMMENT、GRANT、LOCK、RENAME、ENQUEUE、DEQUEUE、CREATE。
在ORACLE中,对象权限通过WITHGRANT OPTION来实现权限的转授,作用和WITHADMIN OPTION类似,但是在REVOKE权限时会发生级联撤销。这种权限通过基表中的单独一个属性来标识的,比如系统权限是通过sysauth$表中的OPTION#列来标识的。
ORACLE对系统权限的转授没有实现级联回收,也就是说用户A将权限转给用户B,用户B再将权限转给用户C,这时收回用户B的权限,而用户C的权限不会被收回。
ORACLE的对象权限的转授是可以实现级联回收的,即回收B用户的权限,C用户的权限也会被回收。要实现权限的级联回收,需要记录权限之间的分配关系,ORACLE由于是通过单独的表(objauth$)实现对象权限管理,表中的GRANTOR#列记录了权限的来源,所以可以通过GRANTOR#列将分配关系串联起来形成树的关系,在REVOKE权限时,通过广度优先遍历清除,即可以实现级联回收。
Oracle中关于权限的系统视图。
SYSTEM_PRIVILEGE_MAP:记录系统权限标识和权限名称的映射关系。
PRIVILEGE |
NUMBER |
权限标识 |
NAME |
VARCHAR2(40) |
权限名,负数 |
PROPERTY |
NUMBER |
??? |
该表的详细信息如下:
create table SYSTEM_PRIVILEGE_MAP sharing=object ( PRIVILEGE number not null, NAME varchar2(40) not null, PROPERTY number not null /* 0x01 = do not export this privilege */ /* using sql statements */ ) / comment on table SYSTEM_PRIVILEGE_MAP is 'Description table for privilege type codes. Maps privilege type numbers to type names' / comment on column SYSTEM_PRIVILEGE_MAP.PRIVILEGE is 'Numeric privilege type code' / comment on column SYSTEM_PRIVILEGE_MAP.NAME is 'Name of the type of privilege' / comment on column SYSTEM_PRIVILEGE_MAP.PROPERTY is 'Property flag of privilege like not export this privilege, etc' / insert into SYSTEM_PRIVILEGE_MAP values (-3, 'ALTER SYSTEM', 0); insert into SYSTEM_PRIVILEGE_MAP values (-4, 'AUDIT SYSTEM', 0); insert into SYSTEM_PRIVILEGE_MAP values (-5, 'CREATE SESSION', 0); insert into SYSTEM_PRIVILEGE_MAP values (-6, 'ALTER SESSION', 0); insert into SYSTEM_PRIVILEGE_MAP values (-7, 'RESTRICTED SESSION', 0); insert into SYSTEM_PRIVILEGE_MAP values (-10, 'CREATE TABLESPACE', 0); insert into SYSTEM_PRIVILEGE_MAP values (-11, 'ALTER TABLESPACE', 0); insert into SYSTEM_PRIVILEGE_MAP values (-12, 'MANAGE TABLESPACE', 0); …… create unique index I_SYSTEM_PRIVILEGE_MAP on SYSTEM_PRIVILEGE_MAP (PRIVILEGE, NAME) / create public synonym SYSTEM_PRIVILEGE_MAP for SYSTEM_PRIVILEGE_MAP / grant select on SYSTEM_PRIVILEGE_MAP to public with grant option /
|
TABLE_PRIVILEGE_MAP:记录对象权限和权限名的映射关系。
PRIVILEGE |
NUMBER |
权限标识 |
NAME |
VARCHAR2(40) |
权限名 |
该表的详细信息如下:
create table TABLE_PRIVILEGE_MAP sharing=object ( PRIVILEGE number not null, NAME varchar2(40) not null) / comment on table TABLE_PRIVILEGE_MAP is 'Description table for privilege (auditing option) type codes. Maps privilege (auditing option) type numbers to type names' / comment on column TABLE_PRIVILEGE_MAP.PRIVILEGE is 'Numeric privilege (auditing option) type code' / comment on column TABLE_PRIVILEGE_MAP.NAME is 'Name of the type of privilege (auditing option)' / insert into TABLE_PRIVILEGE_MAP values (0, 'ALTER'); insert into TABLE_PRIVILEGE_MAP values (1, 'AUDIT'); insert into TABLE_PRIVILEGE_MAP values (2, 'COMMENT'); insert into TABLE_PRIVILEGE_MAP values (3, 'DELETE'); insert into TABLE_PRIVILEGE_MAP values (4, 'GRANT'); insert into TABLE_PRIVILEGE_MAP values (5, 'INDEX'); insert into TABLE_PRIVILEGE_MAP values (6, 'INSERT'); insert into TABLE_PRIVILEGE_MAP values (7, 'LOCK'); insert into TABLE_PRIVILEGE_MAP values (8, 'RENAME'); insert into TABLE_PRIVILEGE_MAP values (9, 'SELECT'); insert into TABLE_PRIVILEGE_MAP values (10, 'UPDATE'); insert into TABLE_PRIVILEGE_MAP values (11, 'REFERENCES'); insert into TABLE_PRIVILEGE_MAP values (12, 'EXECUTE'); insert into TABLE_PRIVILEGE_MAP values (16, 'CREATE'); insert into TABLE_PRIVILEGE_MAP values (17, 'READ'); insert into TABLE_PRIVILEGE_MAP values (18, 'WRITE'); insert into TABLE_PRIVILEGE_MAP values (20, 'ENQUEUE'); insert into TABLE_PRIVILEGE_MAP values (21, 'DEQUEUE'); insert into TABLE_PRIVILEGE_MAP values (22, 'UNDER'); insert into TABLE_PRIVILEGE_MAP values (23, 'ON COMMIT REFRESH'); insert into TABLE_PRIVILEGE_MAP values (24, 'QUERY REWRITE'); insert into TABLE_PRIVILEGE_MAP values (26, 'DEBUG'); insert into TABLE_PRIVILEGE_MAP values (27, 'FLASHBACK'); insert into TABLE_PRIVILEGE_MAP values (28, 'MERGE VIEW'); insert into TABLE_PRIVILEGE_MAP values (29, 'USE'); insert into TABLE_PRIVILEGE_MAP values (30, 'FLASHBACK ARCHIVE');
create unique index I_TABLE_PRIVILEGE_MAP on TABLE_PRIVILEGE_MAP (PRIVILEGE, NAME) / create public synonym TABLE_PRIVILEGE_MAP for TABLE_PRIVILEGE_MAP / grant select on TABLE_PRIVILEGE_MAP to public with grant option |
SYSAUTH$:ORACLE数据库的系统权限基表,不只是系统权限,角色->角色的权限授予也存在这个系统表。
属性 |
类型 |
描述 |
GRANTEE# |
NUMBER |
被授权的主用户 |
PRIVILEGE# |
NUMBER |
权限 |
SEQUENCE# |
NUMBER |
序号 |
OPTION# |
NUMBER |
系统权限,ADMIN OPTION |
|
|
|
其中的SEQUENCE#列使用的是sys_grant序列,表定义和序列定义如下:
create sequence system_grant /* system grant sequence number */ start with 1 increment by 1 minvalue 1 nomaxvalue cache 20 order nocycle
create table sysauth$ /* system authorization table */ ( grantee# number not null, /* grantee number (user# or role#) */ privilege# number not null, /* role or privilege # */ sequence# number not null, /* unique grant sequence */ option$ number) /* null = none, 1 = admin option */ / create unique index i_sysauth1 on sysauth$(grantee#, privilege#) / |
DBA_SYS_PRIVS、USER_SYS_PRIVS:记录被授权的用户分配到的权限以及是否含有ADMIN OPTION。
属性 |
类型 |
描述 |
GRANTEE |
VARCHAR2(30) |
被授权的主用户 |
PRIVILEGE |
VARCHAR2(40) |
权限名 |
ADMIN_OPTION |
VARCHAR3(3) |
是否有admin option,yes or no |
OBJAUTH$:对象权限基表。
属性 |
类型 |
描述 |
OBJ# |
NUMBER |
对象 |
GRANTOR# |
NUMBER |
授权者 |
GRANTEE# |
NUMBER |
被授权对象 |
PRIVILEGE# |
NUMBER |
权限 |
SEQUENCE# |
NUMBER |
序号 |
PARENT |
NUMBER |
??? |
OPTION# |
NUMBER |
WITH GRANT OPTION |
COL# |
NUMBER |
列权限 |
其中的SEQUENCE#列使用的是object_grant列,表定义和序列定义如下:
create sequence object_grant /* object grant sequence number */ start with 1 increment by 1 minvalue 1 nomaxvalue cache 20 order nocycle / create table objauth$ /* table authorization table */ ( obj# number not null, /* object number */ grantor# number not null, /* grantor user number */ grantee# number not null, /* grantee user number */ privilege# number not null, /* table privilege number */ sequence# number not null, /* unique grant sequence */ parent rowid, /* parent */ option$ number, /* null = no options */ /* 0x01 = grant option */ /* 0x02 = hierarchy option */ col# number) /* null = table level, column id if column grant */ / create unique index i_objauth1 on objauth$(obj#, grantor#, grantee#, privilege#, col#) / create index i_objauth2 on objauth$(grantee#, obj#, col#) |
ALL_TAB_PRIVS、DBA_TAB_PRIVS、USER_TAB_PRIVS:记录对象权限中的对象、权限之间的对应关系。
ALL_TAB_PRIVS_MADE和ALL_TAB_PRIVS_RECD的属性也和下表类似。
属性 |
类型 |
描述 |
GRANTOR |
VARCHAR2(30) |
授权者 |
GRANTEE |
VARCHAR2(30) |
获得授权 |
TABLE_SCHEMA |
VARCHAR2(30) |
对象所属schema |
TABLE_NAME |
VARCHAR2(30) |
对象名 |
PRIVILEGE |
VARCHAR2(40) |
权限名 |
GRANTABLE |
VARCHAR2(3) |
GRANT OPTION, YES OR NO |
HIERARCHY |
VARCHAR2(3) |
|
|
|
|
ALL_COL_PRIVS、USER_COL_PRIVS:列与对象权限之间的对应关系。
ALL_COL_PRIVS_MADE和ALL_COL_PRIVS_RECD的属性也和下表类似。
属性 |
类型 |
描述 |
GRANTOR |
VARCHAR2(30) |
授权者 |
GRANTEE |
VARCHAR2(30) |
获得授权 |
TABLE_SCHEMA |
VARCHAR2(30) |
对象所属schema |
TABLE_NAME |
VARCHAR2(30) |
对象名 |
COLUMN_NAME |
VARCHAR2(30) |
列名 |
PRIVILEGE |
VARCHAR2(40) |
权限名 |
GRANTABLE |
VARCHAR2(3) |
GRANT OPTION, YES OR NO |
|
|
|
USER_ROLE_PRIVS:记录了哪一个角色被授予给当前用户。
属性 |
类型 |
描述 |
USERNAME |
VARCHAR2(30) |
用户 |
GRANTED_ROLE |
VARCHAR2(30) |
角色 |
ADMIN_OPTION |
VARCHAR2(3) |
系统权限,ADMIN OPTION |
DEFAULT_ROLE |
VARCHAR2(3) |
|
OS_GRANTED |
VARCHAR2(3) |
|
|
|
|
DBA_ROLE_PRIVS:记录了所有的ROLE->USER的映射关系。
属性 |
类型 |
描述 |
GRANTEE |
VARCHAR2(30) |
用户或角色 |
GRANTED_ROLE |
VARCHAR2(30) |
角色 |
ADMIN_OPTION |
VARCHAR2(3) |
系统权限,ADMIN OPTION |
DEFAULT_ROLE |
VARCHAR2(3) |
|
|
|
|
ROLE_ROLE_PRIVS:记录了角色之间的授予关系。
ROLE_SYS_PRIVS:记录了角色获得的系统权限。
ROLE_TAB_PRIVS:记录了角色获得的对象权限。
SESSION_PRIVS:会话内当前用户的系统权限。