GRANT

说明

设置访问权限,即授权。

语法

grant ::=

grant_system_privileges ::=

grant_role_privileges ::=

grant_object_privileges ::=

grantee_clause ::=

参数

system_privileges

系统权限。包括以下类型:

数据库链接 (系统权限):  
CREATE DATABASELINK 创建数据库链接的权限
CREATE PUBLIC DATABASELINK 创建公有数据库链接的权限
DROP PUBLIC DATABASELINK 删除公有数据库链接的权限
ALTER PUBLIC DATABASELINK 修改公有数据库链接的权限
目录 (系统权限):  
CREATE ANY DIRECTORY 创建任意模式下DIRECTORY的权限
DROP ANY DIRECTORY 删除DIRECTORY的权限
索引 (系统权限):  
CREATE ANY INDEX 创建任意模式下索引的权限
ALTER ANY INDEX 修改任意模式下索引的权限
DROP ANY INDEX 删除任意模式下索引的权限
过程、函数、包 (系统权限):  
CREATE PROCEDURE 创建默认模式下过程、函数、包的权限
CREATE ANY PROCEDURE 创建任意模式下过程、函数、包的权限
ALTER ANY PROCEDURE 修改任意模式下过程、函数、包的权限
DROP ANY PROCEDURE 删除任意模式下过程、函数、包的权限
EXECUTE ANY PROCEDURE 执行任意模式下过程、函数、包的权限
DEBUG ANY PROCEDURE 调试任意模式下过程、函数、包的权限
序列 (系统权限):  
CREATE SEQUENCE 创建默认模式下序列的权限
CREATE ANY SEQUENCE 创建任意模式下序列的权限
ALTER ANY SEQUENCE 修改任意模式下序列的权限
DROP ANY SEQUENCE 删除任意模式下序列的权限
SELECT ANY SEQUENCE 查询任意模式下序列的权限
同义词 (系统权限):  
CREATE SYNONYM 创建默认模式下同义词的权限
CREATE ANY SYNONYM 创建任意模式下同义词的权限
CREATE PUBLIC SYNONYM 创建公有同义词的权限
DROP ANY SYNONYM 删除任意模式下同义词的权限
DROP PUBLIC SYNONYM 删除公有同义词的权限
表 (系统权限):  
CREATE TABLE 创建默认模式下表的权限
CREATE ANY TABLE 创建任意模式下表的权限
ALTER ANY TABLE 修改任意模式下表的权限
DELETE ANY TABLE 对任意模式下的表做删除数据操作的权限
DROP ANY TABLE 删除任意模式下表的权限
INSERT ANY TABLE 对任意模式下的表做插入数据操作的权限
SELECT ANY TABLE 对任意模式下的表做查询数据操作的权限
UPDATE ANY TABLE 对任意模式下的表做更新数据操作的权限
COMMENT ANY TABLE 对任意模式下的表做注释操作的权限
表空间 (系统权限):  
CREATE TABLESPACE 创建表空间的权限
ALTER TABLESPACE 修改表空间的权限
DROP TABLESPACE 删除表空间的权限
UNLIMITED TABLESPACE 在任意表空间创建对象的权限
触发器 (系统权限):  
CREATE TRIGGER 创建默认模式下触发器的权限
CREATE ANY TRIGGER 创建任意模式下触发器的权限
ALTER ANY TRIGGER 修改任意模式下触发器的权限
DROP ANY TRIGGER 删除任意模式下触发器的权限
视图 (系统权限):  
CREATE VIEW 创建默认模式下视图的权限
CREATE ANY VIEW 创建任意模式下视图的权限
DROP ANY VIEW 删除任意模式下视图的权限
数据库连接 (系统权限):  
CONNECT 用户、角色连接数据库的权限
OUTLINE (系统权限):  
CREATE ANY OUTLINE 创建任意模式下OUTLINE的权限
ALTER ANY OUTLINE 修改任意模式下OUTLINE的权限
DROP ANY OUTLINE 删除任意模式下OUTLINE的权限

object_privilege

对象权限类型。

object_type

对象类型。包括以下类型:

模式: 对象权限类型  
SCHEMA CREATE 在模式下创建对象的权限
表: 对象权限类型  
TABLE 或者 缺省 INSERT 向表中插入数据的权限
SELECT 查询表数据的权限
SELECT ( column_list ) 查询表(列)数据的权限
UPDATE 更新表数据的权限
UPDATE ( column_list ) 更新表(列)数据的权限
DELETE 删除表数据的权限
REFERENCES 引用表的权限
REFERENCES ( column_list ) 引用表(列)的权限
INDEX 在表上创建索引的权限
TRIGGER 在表上创建触发器的权限
DEBUG 在表上调试PL功能的权限
视图: 对象权限类型  
缺省 INSERT 向视图中插入数据的权限
SELECT 查询视图数据的权限
SELECT ( column_list ) 查询视图(列)数据的权限
UPDATE 更新视图数据的权限
UPDATE ( column_list ) 更新视图(列)数据的权限
DELETE 删除视图数据的权限
REFERENCES 引用视图的权限
REFERENCES ( column_list ) 引用视图(列)的权限
序列: 对象权限类型  
SEQUENCE SELECT 查询序列数据的权限
UPDATE 更新序列数据的权限
函数: 对象权限类型  
FUNCTION DEBUG 调试函数的权限
EXECUTE 执行函数的权限
存储过程: 对象权限类型  
PROCEDURE DEBUG 调试存储过程的权限
EXECUTE 执行存储过程的权限
包: 对象权限类型  
PACKAGE DEBUG 调试包的权限
EXECUTE 执行包的权限
类型: 对象权限类型  
TYPE DEBUG 调试类型的权限
EXECUTE 执行类型的权限
语言: 对象权限类型  
LANGUAGE USAGE 使用语言的权限

role

角色名。

user

用户名。

PUBLIC

PUBLIC 是一个数据库中的特殊“角色”,所有数据库用户都属于这个角色。授权给 PUBLIC 相当于授权给数据库的所有用户。

WITH ADMIN OPTION

授权选项,对用户或角色应用此选项后,用户或角色可以将系统权限授权给其他用户或其他角色。

object

对象名。

注解

  • 支持带有模式名的对象名。比如 tab1、schm2.tab2。
  • 函数对象权限需要指定形参列表。比如 func1()、fun2(a int)、func3(a int, b varchar(200))、func4(int, varchar(200))。

ALL [PRIVILEGES]

对象上的所有权限。

WITH GRANT OPTION

级联授权选项。若设置了级联授权,则在此次授权命令中得到对象权限的用户或者用户组成员,除得到所授的权限外,还将可以再把该对象上自己已获得的权限授权给其他用户。当在授予角色时使用该参数,被授予角色的用户,则可以把这个角色所拥有所有权限授予给其他用户。获得级联授权权限的用户再次授权时仍然可以使用 WITH GRANT OPTION 将级联授权权限授给其他用户。若不使用级联授权,则获得授权的用户不能将已获得的权限再次授予其他用户。

注解

只有管理员用户、数据库对象所有者或者在该对象上具有授权权限的用户才能执行GRANT语句。

示例

示例1: 授予用户表权限、列权限

--  以 sysdba 登录
CONNECT sysdba/szoscar55;

--  清理环境
DROP USER user1 CASCADE;
DROP TABLE tab1 CASCADE;

--  创建用户
CREATE USER user1;

--  创建表
CREATE TABLE tab1(a INT, b INT);


--  授予用户查询表权限
GRANT SELECT ON tab1 TO user1;

--  授予用户插入表权限、更新 b 列权限
GRANT INSERT, UPDATE(b) ON tab1 TO user1;

--  回收权限
REVOKE INSERT, SELECT, UPDATE(b) ON tab1 FROM user1;


--  删除用户和表
DROP USER user1;
DROP TABLE tab1;

示例2: 授予权限(指定级联授权选项)

--  以 sysdba 登录
CONNECT sysdba/szoscar55;

--  清理环境
DROP USER user3 CASCADE;
DROP USER user2 CASCADE;
DROP TABLE tab2 CASCADE;


--  创建用户
CREATE USER user2 WITH PASSWORD 'abc123!';
CREATE USER user3;

--  创建表
CREATE TABLE tab2(a INT, b INT, c INT);


--  授予权限(指定级联授权选项)
GRANT DELETE, UPDATE(a, b) ON tab2 TO user2 WITH GRANT OPTION;


--  以 user2 登录
CONNECT user2/abc123!;

--  授予权限
GRANT UPDATE(b), DELETE ON sysdba.tab2 TO user3;



--  以 sysdba 登录
CONNECT sysdba/szoscar55;

--  回收 user2 级联权限
REVOKE GRANT OPTION FOR DELETE, UPDATE(b) ON tab2 FROM user2;

--  回收 user2 权限
REVOKE DELETE, UPDATE(b) ON tab2 FROM user2;

--  回收 user3 权限
REVOKE DELETE, UPDATE(b) ON tab2 FROM user3;


--  删除用户和表
DROP USER user3;
DROP USER user2;
DROP TABLE tab2;

示例3: 授予角色权限

--  以 sysdba 登录
CONNECT sysdba/szoscar55;

--  清理环境
DROP ROLE role3;
DROP TABLE tab3 CASCADE;

--  创建角色
CREATE ROLE role3;

--  创建表
CREATE TABLE tab3(a INT, b INT);


--  授予角色查询表权限
--  所有拥有角色 role3 的用户都有了查询 tab3 的权限
GRANT SELECT ON tab3 TO ROLE role3;


--  回收权限
REVOKE SELECT ON tab3 FROM ROLE role3;


--  删除角色和表
DROP ROLE role3;
DROP TABLE tab3;

示例4: 授予所有用户权限

--  以 sysdba 登录
CONNECT sysdba/szoscar55;

--  清理环境
DROP SCHEMA schm4 CASCADE;

--  创建模式
CREATE SCHEMA schm4;


--  授予所有用户在模式 schm4 上创建表的权限
GRANT CREATE ON SCHEMA schm4 TO PUBLIC;


--  回收权限
REVOKE CREATE ON SCHEMA schm4 FROM PUBLIC;


--  删除模式
DROP SCHEMA schm4;

示例5: 授予用户全部表权限

--  以 sysdba 登录
CONNECT sysdba/szoscar55;

--  清理环境
DROP USER user5 CASCADE;
DROP TABLE tab5 CASCADE;

--  创建用户
CREATE USER user5;

--  创建表
CREATE TABLE tab5(a INT, b INT);


--  授予用户表 tab5 上所有权限
GRANT ALL ON tab5 TO user5;

--  回收权限
REVOKE ALL ON tab5 FROM user5;


--  删除用户和表
DROP USER user5;
DROP TABLE tab5;

示例6: 授予多个用户和角色权限

--  以 sysdba 登录
CONNECT sysdba/szoscar55;

--  清理环境
DROP ROLE role7;
DROP ROLE role6;
DROP USER user8 CASCADE;
DROP USER user7 CASCADE;
DROP USER user6 CASCADE;
DROP TABLE tab6 CASCADE;

--  创建角色
CREATE ROLE role6;
CREATE ROLE role7;

--  创建用户
CREATE USER user6;
CREATE USER user7;
CREATE USER user8;

--  创建表
CREATE TABLE tab6(a INT, b INT);


--  授权给多个用户和角色
GRANT ALL ON tab6 TO user6, user7, ROLE role6, user8, ROLE role7;


--  回收权限
REVOKE ALL ON tab6 FROM user6;

REVOKE ALL ON tab6 FROM user8, user7, ROLE role6, ROLE role7;


--  删除用户和表
DROP ROLE role7;
DROP ROLE role6;
DROP USER user8;
DROP USER user7;
DROP USER user6;
DROP TABLE tab6;

示例7: 授予用户一个角色权限

--  以 sysdba 登录
CONNECT sysdba/szoscar55;

--  清理环境
DROP USER user7 CASCADE;


--  创建用户
CREATE USER user7;


--  授予用户一个角色权限
GRANT ROLE sysdba TO USER user7;


--  回收权限
REVOKE ROLE sysdba FROM USER user7;


--  删除用户
DROP USER user7;

示例8: 授予用户创建数据库链接权限

--  以 sysdba 登录
CONNECT sysdba/szoscar55;

--  清理环境
DROP USER user8 CASCADE;


--  创建用户
CREATE USER user8;


--  授予用户创建PUBLIC和普通数据库链接权限和删除public数据库链接权限
GRANT CREATE PUBLIC DATABASELINK TO user8;

GRANT CREATE DATABASELINK TO user8;

GRANT DROP PUBLIC DATABASELINK TO user8;

--  回收用户创建PUBLIC和普通数据库链接权限和删除public数据库链接权限
REVOKE CREATE PUBLIC DATABASELINK FROM user8;

REVOKE CREATE DATABASELINK FROM user8;

REVOKE DROP PUBLIC DATABASELINK FROM user8;


--  删除用户
DROP USER user8;

示例9: 授予用户UNLIMITED TABLESPACE系统权限

 
--创建普通默认用户,该用户创建新的表空间
create user u_1 with password 'szoscar55!';
grant create tablespace to u_1;
connect u_1/szoscar55!;
create tablespace ts_1 datafile 'ts_1.dbf' size 10m;
 --期望成功,用户是表空间创建者
create table t_1(a int) tablespace ts_1;
drop table t_1;


--再创建普通默认用户
CONNECT SYSDBA/szoscar55;
create user u_2 with password 'szoscar55!';
create user u_3 with password 'szoscar55!' default tablespace ts_1;
create user u_4 with password 'szoscar55!';
grant unlimited tablespace to u_4;

connect u_2/szoscar55!;
 --期望失败,用户不是表空间创建者,也不是默认表空间,也没有unlimited权限
create table t_1(a int) tablespace ts_1;
2019-06-20 14:56:08, ERROR, Data Defination Language, 权限访问出错, current user has no privilege on the table space


connect u_3/szoscar55!;
 --期望成功,用户是默认表空间
create table t_1(a int) tablespace ts_1;
drop table t_1;

connect u_4/szoscar55!;
 --期望成功,用户有unlimited权限
create table t_1(a int) tablespace ts_1;
drop table t_1;

CONNECT SYSDBA/szoscar55;
revoke unlimited tablespace from u_4;

connect u_4/szoscar55!;
 --期望失败,用户的unlimited权限被回收
create table t_1(a int) tablespace ts_1;
2019-06-20 14:56:08, ERROR, Data Defination Language, 权限访问出错, current user has no privilege on the table space



CONNECT SYSDBA/szoscar55;
drop tablespace ts_1;
drop user u_1 cascade;
drop user u_2 cascade;
drop user u_3 cascade;
drop user u_4 cascade;