用户管理和自主访问控制
达梦数据库基础管理—用户管理和自主访问控制
二、用户管理
DM 数据库采用“三权分立”或“四权分立”的安全机制,将系统中所有的权限按照类 型进行划分,为每个管理员分配相应的权限,管理员之间的权限相互制约又相互协助,从而 使整个系统具有较高的安全性和较强的灵活性。
可在创建 DM 数据库时通过建库参数 PRIV_FLAG 设置使用“三权分立”或“四权分立”安全机制,0 表示“三权分立”,1 表示“四权分立”。此参数仅在 DM 安全版本下提供, 即仅 DM 安全版本提供“四权分立”安全机制,缺省采用“三权分立”安全机制。
2.1、用户创建介绍
创建用户的操作一般只能由系统预设用户 SYSDBA、SYSSSO 和 SYSAUDITOR 完成, 如果普通用户需要创建用户,必须具有 CREATE USER 的数据库权限。
创建用户的命令是 CREATE USER,创建用户所涉及的内容包括为用户指定用户名、认 证模式、口令、口令策略、空间限制、只读属性以及资源限制。其中用户名是代表用户账号的标识符,长度为 1~128 个字符。用户名可以用双引号括起来,也可以不用,但如果用户名以数字开头,必须用双引号括起来
2.2、用户创建常用语法
2.2.1、语法格式
CREATE USER <用户名>IDENTIFIED<身份验证模式> [PASSWORD_POLICY <口令策略>][<锁定子
句>][<存储加密密钥>][<空间限制子句>][<只读标志>][<资源限制子句>][<允许 IP 子句>][<禁止 IP
子句>][<允许时间子句>][<禁止时间子句>][< TABLESPACE 子句>];
<身份验证模式> ::= <数据库身份验证模式>|<外部身份验证模式>
<数据库身份验证模式> ::= BY <口令>[<散列选项>]
<散列选项> ::= HASH WITH [<密码引擎名>.]<散列算法> [<加盐选项>]
<散列算法> ::= MD5 | SHA1 | SHA224 | SHA256 | SHA384 | SHA512
<加盐选项> ::= [NO] SALT
<外部身份验证模式> ::= EXTERNALLY | EXTERNALLY AS <用户 DN>
<口令策略> ::= 口令策略项的任意组合
<锁定子句> ::= ACCOUNT LOCK | ACCOUNT UNLOCK
<存储加密密钥> ::= ENCRYPT BY <口令>
<空间限制子句> ::= DISKSPACE LIMIT <空间大小>| DISKSPACE UNLIMITED
<只读标志> ::= READ ONLY | NOT READ ONLY
<资源限制子句> ::= DROP PROFILE |
PROFILE <profile 名> |
[LIMIT <资源设置>]
<资源设置> ::= <资源设置项>{,<资源设置项>} |
<资源设置项>{ <资源设置项>}
<资源设置项> ::= SESSION_PER_USER <参数设置>|
CONNECT_IDLE_TIME <参数设置>|
CONNECT_TIME <参数设置>|
CPU_PER_CALL <参数设置>|
CPU_PER_SESSION <参数设置>|
MEM_SPACE <参数设置>|
READ_PER_CALL <参数设置>|
READ_PER_SESSION <参数设置>|
FAILED_LOGIN_ATTEMPS <参数设置>|
PASSWORD_LIFE_TIME <参数设置>|
PASSWORD_REUSE_TIME <参数设置>|
PASSWORD_REUSE_MAX <参数设置>|
PASSWORD_LOCK_TIME <参数设置>|
PASSWORD_GRACE_TIME <参数设置>
<参数设置> ::=<参数值>| UNLIMITED| DEFAULT
<允许 IP 子句> ::= ALLOW_IP <IP 项>{,<IP 项>}
<禁止 IP 子句> ::= NOT_ALLOW_IP <IP 项>{,<IP 项>}
<IP 项> ::= <具体 IP>|<网段>
<允许时间子句> ::= ALLOW_DATETIME <时间项>{,<时间项>}
<禁止时间子句> ::= NOT_ALLOW_DATETIME <时间项>{,<时间项>}
<时间项> ::= <具体时间段> | <规则时间段>
<具体时间段> ::= <具体日期><具体时间> TO <具体日期><具体时间>
<规则时间段> ::= <规则时间标志><具体时间> TO <规则时间标志><具体时间>
<规则时间标志> ::= MON | TUE | WED | THURS | FRI | SAT | SUN
<TABLESPACE 子句> ::=DEFAULT TABLESPACE <表空间名>
2.2.2、口令策略
用户口令最长为 48 字节,创建用户语句中的 PASSWORD POLICY 子句用来指定该用
户的口令策略,系统支持的口令策略有:
- 0 无策略
- 1 禁止与用户名相同
- 2 口令长度不小于 9
- 4 至少包含一个大写字母(A-Z)
- 8 至少包含一个数字(0-9)
- 16 至少包含一个标点符号(英文输入法状态下,除“和空格外的所有符号)
口令策略可单独应用,也可组合应用。组合应用时,如需要应用策略 2 和 4,则设置口令策略为 2+4=6 即可。
-查询当前数据库口令策略,默认是2
SQL> SELECT * FROM V$PARAMETER WHERE NAME= 'PWD_POLICY';
行号 ID NAME TYPE VALUE SYS_VALUE FILE_VALUE DESCRIPTION DEFAULT_VALUE ISDEFAULT
---------- ----------- ---------- ---- ----- --------- ---------- ----------------------- ------------- -----------
1 463 PWD_POLICY SYS 2 2 2 Flag of password policy 2 1
-修改口令策略
例如,将 PWD_POLICY 置为 8,同时修改文件和内存参数,由于 PWD_POLICY 为动态INI 参数,这样设置后新的参数值可以立即生效。
-调用过程进行修改,1代表的是both,2代表spfile
SQL> SP_SET_PARA_VALUE(1, 'PWD_POLICY',8);
DMSQL 过程已成功完成
已用时间: 4.663(毫秒). 执行号:455.
-修改完查询结果
SQL> SELECT * FROM V$PARAMETER WHERE NAME= 'PWD_POLICY';
行号 ID NAME TYPE VALUE SYS_VALUE FILE_VALUE DESCRIPTION DEFAULT_VALUE ISDEFAULT
---------- ----------- ---------- ---- ----- --------- ---------- ----------------------- ------------- -----------
1 463 PWD_POLICY SYS 8 8 8 Flag of password policy 2 0
已用时间: 9.210(毫秒). 执行号:456.
2.2.3、资源限制
用户的资源限制管理有两种方式:
方式一,将用户关联到某个已存在的 PROFILE 对象上,之后用户的资源限制由关联的 PROFILE 统一管理配置,且无法再使用方式二中的 LIMIT <资源设置>设置资源设置项。
方式二,未关联 PROFILE 的用户使用 LIMIT <资源设置>设置资源设置项。 新建用户默认使用方式二管理资源设置,在关联到 PROFILE 时,之前已设置的资源限制项会立即失效。
2.2.4、创建用户
-创建用户失败的登录次数达到3次被锁定5分钟
SQL> create user t1 identified by t12345678 limit failed_login_attemps 3, password_lock_time 5;
操作已执行
已用时间: 132.451(毫秒). 执行号:459.
SQL>
-创建用户在30天内修改过5次后,才能重新使用过去口令
SQL> create user t2 identified by t12345678 limit password_reuse_time 30, password_reuse_max 5;
操作已执行
已用时间: 112.136(毫秒). 执行号:460.
-创建允许的IP段和工作时间段可以访问的用户
SQL> create user t3 identified by t12345678 allow_ip "192.168.10.*" allow_datetime mon "8:30:00" to fri "17:30:00";
操作已执行
已用时间: 75.151(毫秒). 执行号:461.
-创建允许具体IP和具体时间可以访问的用户
SQL> create user t4 identified by t12345678 allow_ip "192.168.10.100" allow_datetime "2022-6-21" "8:30:00" to "2022-6-22" "17:30:00";
操作已执行
已用时间: 70.991(毫秒). 执行号:462.
SQL>
2.2.5、修改用户
-语法:
ALTER USER <用户名> [IDENTIFIED <身份验证模式>][PASSWORD_POLICY <口令策略>][<锁定子 句>][<存储加密密钥>][<空间限制子句>][<只读标志>][<资源限制子句>][<允许 IP 子句>][<禁止 IP 子句>][<允许时间子句>][<禁止时间子句>][<TABLESPACE 子句>][<SCHEMA 子句>];
-例子:
-修改用户的资源属性,登录失败5次锁定时间5分钟,口令终止前可以使用30天,最大宽限时间30天,超过只能修改口令,不允许其他操作
SQL> alter user t1 identified by t123456789 limit failed_login_attemps 5, password_lock_time 5, password_life_time 30, password_grace_time 30;
操作已执行
已用时间: 38.130(毫秒). 执行号:0.
SQL>
-修改用户的默认表空间
SQL> select file_name, tablespace_name from dba_data_files;
行号 FILE_NAME TABLESPACE_NAME
---------- ----------------------------- ---------------
1 +DMDATA/data/dsc/system.dbf SYSTEM
2 +DMDATA/data/dsc/test3_02.dbf TEST3
3 +DMDATA/data/dsc/test3_01.dbf TEST3
4 +DMDATA/data/dsc/DTS_TEST.dbf DTS_TEST
5 +DMDATA/data/dsc/llf.dbf LLF
6 +DMDATA/data/dsc/main.dbf MAIN
7 +DMDATA/data/dsc/TEMP0.DBF TEMP
8 +DMDATA/data/dsc/roll.dbf ROLL
8 rows got
已用时间: 16.083(毫秒). 执行号:1.
SQL>
SQL> alter user t1 default tablespace llf default index tablespace llf;
操作已执行
已用时间: 11.345(毫秒). 执行号:2.
SQL>
SQL> select username, user_id, default_tablespace from dba_users where username in ('T1','T2','T3','T4');
行号 USERNAME USER_ID DEFAULT_TABLESPACE
---------- -------- ----------- ------------------
1 T3 50331753 MAIN
2 T1 50331751 LLF
3 T4 50331754 MAIN
4 T2 50331752 MAIN
已用时间: 39.811(毫秒). 执行号:4.
SQL>
2.2.6、删除用户
-语法:
DROP USER [IF EXISTS] <用户名> [RESTRICT | CASCADE];
指定 IF EXISTS 关键字后,删除不存在的用户时不会报错,否则会报错。
如果在删除用户时未使用 CASCADE 选项(缺省使用 RESTRICT 选项),若该用户建立了数据库对象,DM 将返回错误信息,而不删除此用户。
如果在删除用户时使用了 CASCADE 选项,除数据库中该用户及其创建的所有对象被删
除外,若其他用户创建的对象引用了该用户的对象,DM 还将自动删除相应的引用完整性约
束及依赖关系。
-删除用户t1
SQL> drop user t1 cascade;
操作已执行
已用时间: 503.633(毫秒). 执行号:5.
三、自主访问控制
自主访问控制(Discretionary Access Control,DAC)是指主体能够将其拥有的对某个客体的一种或多种访问权自主地授予其他主体。并在随后的任何时刻将这些权限回收。这种控制是自主的,指具有授予某种访问权限的主体能够自己决定是否将某部分访问权限授予其他的主体,或从其他主体那里收回该访问权限。也就是说,在自主访问控制下,用户可以按照自己的意愿,有选择地与其他用户共享他拥有的数据库对象。
自主访问控制中,主体可以针对所拥有的客体制定自己的访问策略。
- 每个主体都有一个用户名,属于一个组或拥有一个角色。
- 每个客体都拥有一个访问控制列表(ACL),用于限定主体对其的访问权限。
- 每次访问时都会按照访问控制列表检查主体是否具有访问权限,以实现对主体访问权限的控制
3.1、权限管理
用户权限有两类:数据库(系统)权限和对象权限。数据库权限主要是指针对数据库对象的创建、删除、修改的权限,对数据库备份等权限。而对象权限主要是指对数据库对象中的数据的访问权限。数据库权限一般由SYSDBA、SYSAUDITOR和SYSSSO指定,也可以由具有特权的其他用户授予。对象权限一般由数据库对象的所有者授予用户,也可由SYSDBA用户指定,或者由具有该对象权限的其他用户授权。
3.1.1、数据库权限
常用数据库权限如下:
CREATE SESSION: 创建会话的权限,新建用户默认具有此权限
CREATE VIEW: 在自己的模式中创建视图的权限
CREATE USER: 创建用户的权限
CREATE TRIGGER: 在自己的模式中创建触发器的权限
ALTER USER: 修改用户的权限
ALTER DATABASE: 修改数据库的权限
CREATE TABLE:创建表
CREATE ANY TABLE:在任意模式下创建表
ALTER ANY TABLE:修改任意表
DROP ANY TABLE:删除任意表
INSERT TABLE:插入表记录
INSERT ANY TABLE:向任意表插入记录
UPDATE TABLE:更新表记录
UPDATE ANY TABLE:更新任意表的记录
DELETE TABLE:删除表记录
DELETE ANY TABLE:删除任意表的记录
SELECT ANY TABLE:查询任意表的记录
REFERENCES TABLE:引用表
REFERENCES ANY TABLE:引用任意表
DUMP TABLE:导出表
DUMP ANY TABLE:导出任意表
GRANT TABLE:向其他用户进行表上权限的授权
GRANT ANY TABLE:向其他用户进行任意表上权限的授权
--存储程序对象,其相关的数据库权限则包括:
CREATE PROCEDURE:创建存储程序
CREATE ANY PROCEDURE:在任意模式下创建存储程序
DROP PROCEDURE:删除存储程序
DROP ANY PROCEDURE:删除任意存储程序
EXECUTE PROCEDURE:执行存储程序
EXECUTE ANY PROCEDURE:执行任意存储程序
GRANT PROCEDURE:向其他用户进行存储程序上权限的授权
GRANT ANY PROCEDURE:向其他用户进行任意存储程序上权限的授权
3.1.2、对象权限
常用的对象权限:
3.2、角色管理
角色是一组权限的组合,使用角色的目的是使权限管理更加方便。
3.2.1、预定义角色
DBA 类型对应 DBA、RESOURCE、PUBLIC、VTI、SOI 预定义角色
1) 新建的用户默认只有create session的权限,即只能连接数据库无法进行任何操作。
2) SOI具有系统表的查询权限,即SYS模式下SYS开头的数据字典表。
3) VTI具有系统动态视图的查询权限,即SYS模式下V$开头的视图。
4) PUBLIC不可以创建数据库对象,即相较RESOURCE没有CREATE权限,有绝大多数数据库权限。
5) RESOURCE可以创建数据库对象,但只能在对应模式下创建、修改对象等,有绝大多数数据库权限。
6) DBA具有数据库系统中对象与数据操作的最高权限集合,比REOUSRCE多了CREATE ANY、ALTER ANY、DROP ANY等跨模式的权限操作,也可认为在最高层级进行数据库整体结构的修改。
AUDITOR:DB_ADUTI_ADMIN、DB_AUDIT_OPER、DB_AUDIT_PUBLIC、DB_AUDIT_VTI、DB_AUDIT_SOI 预定义角色;
SSO:DB_POLICY_ADMIN、DB_POLICY_OPER、DB_POLICY_PUBLIC、 DB_POLICY_VTI、DB_POLICY_SOI 预定义角色;
DBO:DB_OBJECT_ADMIN、DB_OBJECT_OPER、DB_OBJECT_PUBLIC、 DB_OBJECT_VTI、DB_OBJECT_SOI 预定义角色。
3.2.2、角色的创建
-具有“CREATE ROLE”数据库权限的用户也可以创建新的角色,其语法如下:
CREATE ROLE <角色名>;
使用说明:
1. 创建者必须具有 CREATE ROLE 数据库权限;
2. 角色名的长度不能超过 128 个字符;
3. 角色名不允许和系统已存在的用户名重名;
4. 角色名不允许是 DM 保留字
-例:创建角色role_test,并赋予查询llf.test表的权限
SQL> create role role_test;
操作已执行
已用时间: 64.407(毫秒). 执行号:300.
SQL> grant select on llf.test to role_test;
操作已执行
已用时间: 65.337(毫秒). 执行号:301.
SQL>
3.2.3、角色的删除
-具有“DROP ROLE”权限的用户可以删除角色,其语法如下:
DROP ROLE [IF EXISTS] <角色名>;
即使已将角色授予了其他用户,删除这个角色的操作也将成功。此时,那些之前被授予 该角色的用户将不再具有这个角色所拥有的权限,除非用户通过其他途径也获得了这个角色所具有的权限。
-删除角色role_test
SQL> drop role role_test;
操作已执行
已用时间: 70.549(毫秒). 执行号:600.
3.2.4、角色的禁用与启用
-使用 DM 系统过程 SP_SET_ROLE 来设置这个角色为不可用,将第二参数置为 0 表示禁用角色。
-例如,下面的语句将角色 TEST_ROLE 禁用
SP_SET_ROLE('TEST_ROLE', 0);
-例如,下面的语句将角色 TEST_ROLE 启用
SP_SET_ROLE(' TEST_ROLE ', 1);
使用说明:
1. 只有拥有 ADMIN_ANY_ROLE 权限的用户才能启用和禁用角色,并且设置后立即生效;
2. 凡是包含禁用角色 A 的角色 M,M 中禁用的角色 A 将无效,但是M 仍有效;
3. 系统预设的角色是不能设置的,如:DBA、PUBLIC、RESOURCE。
3.2.5、查看指定用户的权限
-查看指定用户拥有的所有权限(系统权限、对象权限、角色),分别是通过dba_sys_privs,dba_tab_privs,dba_role_privs三个视图来查看。
SQL> select * from dba_sys_privs where grantee='SYSDBA';
行号 GRANTEE PRIVILEGE ADMIN_OPTION
---------- ------- -------------- ------------
1 SYSDBA CREATE SESSION YES
已用时间: 3.222(毫秒). 执行号:602.
SQL> select * from dba_tab_privs where grantee='SYSDBA';
行号 GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTABLE HIERARCHY
---------- ------- ----- ----------- ------- --------- --------- ---------
1 SYSDBA SYS DBMS_XMLGEN SYS EXECUTE NO NO
已用时间: 9.774(毫秒). 执行号:603.
SQL> select * from dba_role_privs where grantee='SYSDBA';
行号 GRANTEE GRANTED_ROLE ADMIN_OPTION DEFAULT_ROLE
---------- ------- ------------ ------------ ------------
1 SYSDBA DBA Y NULL
2 SYSDBA RESOURCE Y NULL
3 SYSDBA PUBLIC Y NULL
4 SYSDBA SYS_ADMIN N NULL
5 SYSDBA SOI Y NULL
已用时间: 3.313(毫秒). 执行号:604.
-SYSDBA拥有下述权限:
(1)create session的系统权限
(2)执行DMBS_XMLGEN系统包的对象权限
(3)DBA、RESOURCE、PUBLIC、SYS_ADMIN、SOI的角色权限
3.3、权限的分配与回收
可以通过 GRANT 语句将权限(包括数据库权限、对象权限以及角色权限)分配给用户和角色,之后也可以使用 REVOKE 语句将授出的权限再进行回收。
3.3.1、权限的分配
-数据库权限的授权语句语法为:
GRANT <特权> TO <用户或角色>{,<用户或角色>} [WITH ADMIN OPTION];
<特权> ::= <数据库权限>{,<数据库权限>};
<用户或角色>::= <用户名> | <角色名>
使用说明:
1. 授权者必须具有对应的数据库权限以及其转授权;
2. 接受者必须与授权者用户类型一致;
3. 如果有 WITH ADMIN OPTION 选项,接受者可以再把这些权限转授给其他用户/角色。
-例:将创建表、创建视图权限给T2并允许其转授
SQL> select * from dba_sys_privs where grantee='T2';
行号 GRANTEE PRIVILEGE ADMIN_OPTION
---------- ------- -------------- ------------
1 T2 CREATE SESSION NO
已用时间: 2.334(毫秒). 执行号:605.
SQL> select * from dba_tab_privs where grantee='T2';
未选定行
已用时间: 9.398(毫秒). 执行号:606.
SQL> select * from dba_role_privs where grantee='T2';
行号 GRANTEE GRANTED_ROLE ADMIN_OPTION DEFAULT_ROLE
---------- ------- ------------ ------------ ------------
1 T2 PUBLIC N NULL
2 T2 SOI N NULL
已用时间: 2.416(毫秒). 执行号:607.
SQL>
SQL> grant create table, create view to t2 with admin option;
操作已执行
已用时间: 61.011(毫秒). 执行号:608.
SQL>
SQL> select * from dba_sys_privs where grantee='T2';
行号 GRANTEE PRIVILEGE ADMIN_OPTION
---------- ------- -------------- ------------
1 T2 CREATE TABLE YES
2 T2 CREATE VIEW YES
3 T2 CREATE SESSION NO
已用时间: 0.495(毫秒). 执行号:609.
3.3.2、权限的回收
-回收数据库权限的语句语法为:
REVOKE [ADMIN OPTION FOR]<特权> FROM <用户或角色>{,<用户或角色>} ;
<特权> ::= <数据库权限>{,<数据库权限>}
<用户或角色>::= <用户名> | <角色名>
使用说明:
1. 权限回收者必须是具有回收相应数据库权限以及转授权的用户;
2. ADMIN OPTION FOR 选项的意义是取消用户或角色的转授权限,但是权限不回收。
-例:回收用户T2的create table权限
SQL> revoke create table from t2;
操作已执行
已用时间: 18.643(毫秒). 执行号:610.
SQL>
SQL> select * from dba_sys_privs where grantee='T2';
行号 GRANTEE PRIVILEGE ADMIN_OPTION
---------- ------- -------------- ------------
1 T2 CREATE VIEW YES
2 T2 CREATE SESSION NO
已用时间: 0.521(毫秒). 执行号:611.
-例:回收用户T2转授create view的权限
SQL> revoke admin option for create view from t2;
操作已执行
已用时间: 61.097(毫秒). 执行号:612.
SQL>
SQL> select * from dba_sys_privs where grantee='T2';
行号 GRANTEE PRIVILEGE ADMIN_OPTION
---------- ------- -------------- ------------
1 T2 CREATE VIEW NO
2 T2 CREATE SESSION NO
已用时间: 0.486(毫秒). 执行号:613.
3.3.3、测试权限分配与回收
3.3.3.1测试1:用户AA有创建表的权限,且该权限可以进行转授
1、授予用户AA建表权限且可转授
2、用户BB没有建表权限,此时创建表失败
3、用户AA将建表权限转授给用户BB
4、用户BB创建表TEST成功
-创建用户
SQL> create user AA identified by llf123456 default tablespace llf default index tablespace llf;
操作已执行
已用时间: 99.159(毫秒). 执行号:614.
SQL>
SQL> create user BB identified by llf123456 default tablespace llf default index tablespace llf;
操作已执行
已用时间: 110.901(毫秒). 执行号:615.
-授权
SQL> grant create table to aa with admin option;
操作已执行
已用时间: 61.041(毫秒). 执行号:616.
SQL>
SQL> conn aa/llf123456
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 4.494(ms)
SQL>
SQL> create table test(id number);
操作已执行
已用时间: 51.568(毫秒). 执行号:700.
SQL>
SQL> conn bb/llf123456
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 5.076(ms)
SQL>
SQL> create table test(id number);
create table test(id number);
第1 行附近出现错误[-5515]:没有创建表权限.
已用时间: 1.426(毫秒). 执行号:0.
SQL>
SQL> conn aa/llf123456
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.335(ms)
SQL>
SQL> grant create table to bb;
操作已执行
已用时间: 44.419(毫秒). 执行号:800.
SQL>
SQL> conn bb/llf123456
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.834(ms)
SQL>
SQL> create table test(id number);
操作已执行
已用时间: 55.354(毫秒). 执行号:900.
3.3.3.2测试2:回收用户AA转授建表权限的权限
1、回收用户AA转授建表权限的权限
2、用户AA像用户BB授予建表权限失败
SQL> conn SYSDBA/SYSDBA
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.661(ms)
SQL>
SQL> revoke admin option for create table from aa;
操作已执行
已用时间: 46.260(毫秒). 执行号:1000.
SQL>
SQL> conn aa/llf123456
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.612(ms)
SQL>
SQL> create table test1(id number);
操作已执行
已用时间: 72.334(毫秒). 执行号:1100.
SQL>
SQL> grant create table to bb;
grant create table to bb;
第1 行附近出现错误[-5567]:授权者没有此授权权限.
已用时间: 0.653(毫秒). 执行号:0.
3.3.3.3测试3:授予AA对表BB.TEST的增删改查权限,且该权限可以转授用户CC
1、授予AA对表BB.TEST的增删改查权限
2、用户AA对表BB.TEST数据修改成功
3、用户AA将对表BB.TEST的增删改查权限授予用户CC
4、用户CC对表BB.TEST修改成功
SQL> grant insert,delete,update,select on bb.test to aa with grant option;
操作已执行
已用时间: 42.195(毫秒). 执行号:1402.
SQL>
SQL> conn aa/llf123456
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.575(ms)
SQL>
SQL> select * from bb.test;
未选定行
已用时间: 6.171(毫秒). 执行号:1500.
SQL>
SQL> insert into bb.test values(1);
影响行数 1
已用时间: 1.314(毫秒). 执行号:1501.
SQL> commit;
操作已执行
已用时间: 1.240(毫秒). 执行号:1502.
SQL>
SQL> select * from bb.test;
行号 ID
---------- --
1 1
已用时间: 0.707(毫秒). 执行号:1503.
SQL>
SQL>
SQL> update bb.test set id=2 where id=1;
影响行数 1
已用时间: 1.651(毫秒). 执行号:1504.
SQL>
SQL> commit;
操作已执行
已用时间: 1.054(毫秒). 执行号:1505.
SQL>
SQL> select * from bb.test;
行号 ID
---------- --
1 2
已用时间: 0.358(毫秒). 执行号:1506.
SQL>
SQL> conn SYSDBA/SYSDBA
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.507(ms)
SQL> create user CC identified by llf123456 default tablespace llf default index tablespace llf;
操作已执行
已用时间: 85.260(毫秒). 执行号:1600.
SQL>
SQL> conn aa/llf123456
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.989(ms)
SQL>
SQL> grant insert,delete,update,select on bb.test to cc;
操作已执行
已用时间: 68.471(毫秒). 执行号:1700.
SQL> conn CC/llf123456
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.994(ms)
SQL>
SQL> select * from bb.test;
行号 ID
---------- --
1 2
已用时间: 4.261(毫秒). 执行号:1800.
SQL> update bb.test set id=3 where id=2;
影响行数 1
已用时间: 2.629(毫秒). 执行号:1801.
SQL> commit;
操作已执行
已用时间: 1.070(毫秒). 执行号:1802.
SQL>
SQL> select * from bb.test;
行号 ID
---------- --
1 3
已用时间: 0.358(毫秒). 执行号:1803.
SQL>
SQL> delete from bb.test;
影响行数 1
已用时间: 0.783(毫秒). 执行号:1804.
SQL> commit;
操作已执行
已用时间: 1.132(毫秒). 执行号:1805.
SQL>
SQL> select * from bb.test;
未选定行
已用时间: 0.495(毫秒). 执行号:1806.
SQL>
SQL> conn SYSDBA/SYSDBA
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 5.239(ms)
SQL>
SQL> select * from dba_tab_privs where grantee='AA';
行号 GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTABLE HIERARCHY
---------- ------- ----- ---------- ------- --------- --------- ---------
1 AA BB TEST SYSDBA UPDATE YES NO
2 AA BB TEST SYSDBA DELETE YES NO
3 AA BB TEST SYSDBA INSERT YES NO
4 AA BB TEST SYSDBA SELECT YES NO
已用时间: 12.122(毫秒). 执行号:1902.
SQL> select * from dba_tab_privs where grantee='CC';
行号 GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTABLE HIERARCHY
---------- ------- ----- ---------- ------- --------- --------- ---------
1 CC BB TEST AA UPDATE NO NO
2 CC BB TEST AA DELETE NO NO
3 CC BB TEST AA INSERT NO NO
4 CC BB TEST AA SELECT NO NO
已用时间: 9.000(毫秒). 执行号:1903.
3.3.3.4测试4:回收用户AA对表BB.TEST的全部权限
1、由于用户AA还将该权限授予用户CC,因此权限回收失败
2、增加CASCADE选项后,回收成功
3、回收后用户AA和CC修改表BB.TEST失败
注意:可以使用 REVOKE 语句回收授出的指定数据库对象的指定权限。当回收涉及转授对象权限的时候,必须加CASCADE回收选项。
SQL> conn SYSDBA/SYSDBA
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.306(ms)
SQL> revoke insert,delete,update,select on bb.test from aa;
revoke insert,delete,update,select on bb.test from aa;
第1 行附近出现错误[-5582]:回收权限无效.
已用时间: 3.010(毫秒). 执行号:0.
SQL>
SQL> revoke insert,delete,update,select on bb.test from aa cascade;
操作已执行
已用时间: 69.204(毫秒). 执行号:2000.
3.3.3.5测试5:用户AA可以通过角色的赋予,对表BB.TEST和表BB.TEST1进行访问
1、赋予角色ROLE_TEST访问BB.TEST表的权限
2、将角色ROLE_TEST赋予角色ROLE_TEST1
3、赋予角色ROLE_TEST1访问BB.TEST1表权限
4、赋予用户AA角色ROLE_TEST1
注意,角色的转授是不支持循环转授的。
SQL> conn SYSDBA/SYSDBA
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 4.914(ms)
SQL> create role role_test;
操作已执行
已用时间: 65.385(毫秒). 执行号:2200.
SQL>
SQL> grant select on bb.test to role_test;
操作已执行
已用时间: 62.837(毫秒). 执行号:2201.
SQL>
SQL> create role role_test1;
操作已执行
已用时间: 38.900(毫秒). 执行号:2202.
SQL>
SQL> grant role_test to role_test1;
操作已执行
已用时间: 41.039(毫秒). 执行号:2203.
SQL>
SQL> grant select on bb.test1 to role_test1;
操作已执行
已用时间: 20.636(毫秒). 执行号:2204.
SQL>
SQL> grant role_test1 to aa;
操作已执行
已用时间: 40.700(毫秒). 执行号:2205.
SQL>
SQL> conn aa/llf123456
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.289(ms)
SQL>
SQL> select * from bb.test union all
2 select * from bb.test1;
行号 ID
---------- --
1 1
2 2
3 1
4 2
已用时间: 5.528(毫秒). 执行号:2300.
SQL> select * from bb.test
2 union
3 select * from bb.test1;
行号 ID
---------- --
1 1
2 2
已用时间: 1.276(毫秒). 执行号:2301.
3.3.3.6测试6:将用户AA的角色ROLE_TEST1回收,使其对表的查询失败
1、将用户AA的角色ROLE_TEST1回收
2、用户AA可以对表BB.TEST和表BB.TEST1查询失败
注意:使用 ADMIN OPTION FOR 可以收回用户或角色权限转授的权利,而不回收用户或角色的权限。
SQL> conn SYSDBA/SYSDBA
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 4.059(ms)
SQL> revoke role_test1 from aa;
操作已执行
已用时间: 65.551(毫秒). 执行号:2400.
SQL>
SQL> conn aa/llf123456
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.628(ms)
SQL>
SQL> select * from bb.test
2 union all
3 select * from bb.test1;
select * from bb.test
union all
select * from bb.test1;
[-5504]:没有[TEST]对象的查询权限.
已用时间: 5.122(毫秒). 执行号:0.
社区地址:https://eco.dameng.com