oracle sql 基础(六):数据控制语言(用户及权限管理)
权限是执行特殊SQL语句的权利。数据库管理员 (DBA) 是一个具有授予用户访问数据库及其对象的能力的高级用户。用户需要系统权限来访问数据库,需要对象权限来操纵数据库中对象的内容。用户也可以将被授予的权限给其它用户或者角色,角色是相关权限的命名分组。方案是对象的集合,例如,视图和序列的集合。方案被数据库用户拥有,并且与用户有相同的名字。
1.创建用户
DBA通过执行CREATE USER语句来创建用户,在这时用户没有任何权限。DBA可以给用户授予权限,这些权限决定用户能够在数据库级别做什么。语法:
CREATE USER user IDENTIFIED BY password; --user 是被创建的用户的名字 --password 指定用户必须用该口令登录
你可以用ALTER USER语句改变你的口令。语法:
ALTER USER user IDENTIFIED BY password;
2.授权系统权限
创建了一个用户后,DBA可以指定系统权限给该用户。使用下面的语法:
GRANT privilege[,privilege...] TO user [,user|role,PUBLIC...];
--privilege 指定给用户或角色的权限
对用户和角色有100多个不同的可用系统权限,系统权限有数据库管理员(DBA)提供。当前会话的系统权限可以在字典视图SESSION_PRIVS中找到。下面是典型的DBA权限:
系统权限 | 权限的操作 |
CREATE USER | 可以创建其他 Oracle 用户 (需要有 DBA 角色权限) |
DROP USER | 可以删除另一个用户 |
DROP ANY TABLE | 可以删除在任意方案中的表 |
BACKUP ANY TABLE | 可以备份在任何方案中的任何表 |
SELECT ANY TABLE | 可以查询在任何方案中的表、视图或快照 |
CREATE ANY TABLE | 可以在任何方案中创建表 |
CREATE SESSION | 连接到数据库 |
CREATE TABLE | 在用户的方案中创建表 |
CREATE SEQUENCE | 在用户的方案中创建序列 |
CREATE VIEW | 在用户的方案中创建视图 |
CREATE PROCEDURE | 在用户的方案中创建存储过程、函数或包 |
3.创建并授权角色
角色是命名的可以授予用户的相关权限的组,该方法使得授予、撤回和维护权限容易的多。一个用户可以使用几个角色,并且几个用户也可以被指定相同的角色。角色典型地为数据库应用程序创建。创建和分配角色,首先,DBA必须创建角色,然后,DBA可以分配角色给角色和用户。创建角色语法:
CREATE ROLE role; --role 要被创建的角色的名字
DBA创建角色后,可以用GRANT语句给用户指定角色,也可以指定权限给角色。角色用于简化授予和撤消权限的过程,授权角色语法:
GRANT privilege TO role; GRANT role TO user;
4.授权并撤销对象权限
对象权限是在指定的表、视图、序列或过程上执行指定动作的权限或权利。每个对象都有一个特殊的可授予的权限集。可以如下表来理解对象权限:
对象权限 | TABLE | VIEW | SEQUENCE | PROCEDURE |
ALTER | √ | √ | ||
DELETE | √ | √ | ||
EXECUTE | √ | |||
INDEX | √ | |||
INSERT | √ | √ | ||
REFERENCES | √ | √ | ||
SELECT | √ | √ | √ | |
UPDATE | √ | √ |
不同的对象权限对于不同类型的方案对象的是有用的,一个用户自动拥有包含在该用户的方案中的所有对象权限,一个用户可以授予该用户所拥有的任何方案对象上任何对象权限给另一个用户或角色。授权单位权限语法:
GRANT {object_priv[(columns)]|ALL} ON object TO {user|role|PUBLIC} [WITH GRANT OPTION]; --object_priv 将被授予的对象权限
--ALL 指定所有对象权限 --columns 从一个表或视图中指定被授予权限的列 --ON object 权限被授予的对象 --TO 指定权限被授予谁 --PUBLIC 授予权限给所有用户 --WITH GRANT OPTION 允许被授予权限的人再授予对象权限给其他用户和角色
为了授予权限到一个对象上,对象必须在你自己拥有的方案中,或者你必须被用WITH GRANT OPTION选项授予了对象权限。任何对象的所有者自动地获得该对象所有对象权限,可以授予任何该对象上的对象权限给任何其他的用户或者数据库的角色。
可以用REVOKE语句撤消授予其他用户的对象权限。当你用REVOKE语句时,你指定要从用户那里撤消的权限,并且通过WITH GRANT OPTION子句被级联授权的那些用户的权限也将被撤消。撤销单位权限语法:
REVOKE {privilege [,privilege...]|ALL} ON object FROM {user[,user...]|role|PUBLIC} [CASCADE CONSTRAINTS]; --CASCADE CONSTRAINTS 用于删除任何与该对象相关的约束和对象,例如索引、触发器、权限、完整性约束等。
5.查询已授予的权限
如果你试图执行一个为授权的操作,例如从你没有删除权限的表中删除行,Oracle服务器将不允许该操作发生。如果你收到Oracle服务器错误信息 “table or view does not exist,”说明发生了下面的错误:指定的表或视图不存在,试图在一个你没有适当权限的表或视图上执行一个操作。你可以通过访问数据字典来查看你所有的权限。下表中描述了各种数据字典视图。
数据字典视图 | 说明 |
ROLE_SYS_PRIVS | 授予角色的系统权限 |
ROLE_TAB_PRIVS | 授予角色的表权限 |
USER_ROLE_PRIVS | 可由用户访问的角色 |
USER_TAB_PRIVS_MADE | 授予用户的对象上的对象权限 |
USER_TAB_PRIVS_RECD | 授予用户的对象权限 |
USER_COL_PRIVS_MADE | 授予用户对象的列上的对象权限 |
USER_COL_PRIVS_RECD | 授予用户在指定列上的对象权限 |
USER_SYS_PRIVS | 授予用户的系统权限 |