------------------------数据控制语言-----
数据控制语言(data control language,DCL)在SQL中,数据控制功能包括事务管理功能和数据保护功能,即数据库的恢复、
并发控制、数据库的安全性和完整性控制等。这里主要说一下数据库的安全性控制功能。
数据库管理系统(DBMS)必须具备以下功能:
1.将授权的决定告知系统,这是有SQL的GRANT和REVOKE语句来完成的;
2.将授权的结果存入数据字典;
3.当用户提出操作请求时,根据授权情况进行检查,以决定是否执行操作请求。
-----GRANT 语句
--向用户授予权限--GRANT <权限 >[,<权限 >] ...
--[ON <对象类型 ><对象名>]
--TO <用户>[,<用户>]...
--[WITH GRANT OPTION]
权限的分类:
(1)对属性列(TABLE COLUMN)和视图(TABLE VIEW)的操作权限包括SELECT\INSERT\UPDATE\DELETE以及这四种权限的总和ALLPRIVILEGES。(2)对基表(TABLE)的操作权限包括查询(SELECT)、插入(INSERT)、修改(UPDATE)、删除(DELETE)、修改表(ALTER)、建立索引(INDEX)、六种权限的总和(ALLPRIVILEGES)。
(3)对数据库(DATABASE)可以有建表的权限(CREATE TABLE),该权限属于DBA,可由DBA授予权限给普通用户,普通用户有此权限后可以建表,基表的所有者拥有对该表的一切操作权限。
对数据库的权限即系统权限还包括 CREATE SESSION(登录数据库的权限)、CREATE SEQUENCE、CREATE VIEW、CREATE PROCEDURE 等。
ALTER ANY TABLE( 可以修改所有表的权限)
SELECT ANY TABLE(可以查询所有表的权限)
注意:不针对对象的权限就是系统权限,对象指(表、视图等)
接受权限的用户可以是一个或者多个用户,也可以是全体用户(PUBLIC)。
如果指定了 WITH GRANT OPTION 则获得某种权限的用户可以把这种权限再授予给其他用户,若是没有指定该子句,则获得此权限的用户只能使用该权限而不能传播该权限。
示例:
--第一:给用户分配系统权限(建立了一个用户叫 WO)
--GRANT 权限 TO 用户名;GRANT CREATE SESSION TO WO--授予用户可以连接导数据库
GRANT CREATE TABLE TO WO--授予用户建表的权限
--ORA-01031: 权限不足(权限不足所报的错误)
GRANT INSERT ANY TABLE TO WO --插入表的权限
GRANT UPDATE ANY TABLE TO WO --修改表的权限
GRANT UNLIMITED TABLESPACE TO WO --授予用户可以使用表空间
GRANT CREATE USER TO WO --授予用户可以创建用户
GRANT DROP USER TO WO --授予用户删除用户的权限
查询当前用户所拥有的系统权限:
SELECT * FROM user_sys_privs;--这是一个视图;
--第二:给用户分配对象权限
--GRANT 权限 ON schema.对象名 TO 用户名;GRANT SELECT,UPDATE,INSERT ON EMP TO WO --在用户SCOTT 下将EMP 表的权限给了用户WO
在用户WO中查询EMP表:SELECT * FROM SCOTT.EMP;
在用于WO中更新EMP表:UPDATE SCOTT.EMP SET DEPTNO=20 WHERE DEPTNO=30
GRANT ALL ON EMP TO WO;--将对象上所有的权限都给某人
GRANT INSERT ON EMP TO PUBLIC;--PUBLIC 表示所有用户
ALL 权限不包括 DROP 哦!
GRANT ALL ON SCOTT TO WO;--ORA-00942: 表或视图不存在
GRANT SELECT TO WO;--ORA-01919: 角色 'SELECT' 不存在--(对象权限就得赋予给对象)
GRANT SELECT ON EMP TO SCOTT;--在SCOTT 里运行的且EMP 表是SCOTT 的,则报错--ORA-01749: 用户不能自己为自己 GRANT/REVOKE 权限
查询当前用户所具有的权限:
SELECT * FROM user_tab_privs;
--第三:将权限控制在表列级别上
--GRANT UPDATE(列名) ON 表名 TO 用户名 (只能修改表中固定的列)--GRANT INSERT (列名) ON 表名 TO 用户名(只能插入表中固定的列)
查询 SELECT,删除 DELETE 不能控制到列级别
--第四:权限的传递
--将自己拥有的权限继续分配给别人系统权限的传递:GRANT 权限 TO 用户名 WITH ADMIN OPTION
对象权限的传递:GRANT 权限 TO 用户名 WITH GRANT OPTION
-------------REVOKE 语句
--授予的权限可以由DBA 或其他授权者用REVOKE 语句收回,REVOKE 语句的一般格式为:--REVOKE <权限>[,<权限>]...
--[ON <对象类型><对象名称>]
--FROM <用户>[,<用户>]...;
如果USER1将一个权限给了USER2,USER2又给了USER3,则在执行DBMS回收USER1的权限时,也会同时收回USER2和USER3的权限,
即收回权限的操作会级联下去。
系统权限收回:REVOKE 权限 FROM 用户名;
对象权限收回: REVOKE 权限 ON 对象名 FROM 用户名;