腾讯云社区的朋友们大家好啊。
最近在学习SQL,关于WITH ADMIN OPTION和WITH GRANT OPTION有什么区别呢。
Follow me!
权限Privileges是执行特定与语句的权限。
数据库安全包括了系统安全和数据安全。
系统权限:获得数据库的访问权限,并且能执行特定DDL操作(系统安全)。
对象权限:处理数据库对象的内容 比如SELECT UPDATE INSERT.....(数据安全)。
方案/模式(SCHEMA):对象的集合,例如表、视图、序列和同义词的集合。并且SCHEMA和USER是同名。
通过使用DCL语言为用户赋权(GRANT),和撤销权限(REVOKE)
用户的系统权限:
CREATE SESSION创建会话
CREATE TABLE创建表
CREATE SEQUENCE创建序列
CREATE VIEW创建视图
CREATE PROCEDURE创建存储过程
WITH ADMIN OPTION 用于系统权限授权,WITH GRANT OPTION 用于对象权限授权。
接下来通过一个小实验带大家彻底了解两个授权的区别。
--创建两个用户赋予密码确保用户为非锁定状态,并查看用户的系统权限
CREATE USER a IDENTIFIED BY oracle ACCOUNT UNLOCK;
CREATE USER b IDENTIFIED BY oracle ACCOUNT UNLOCK;
--查看用户权限
SYS@10.10.10.1:1521/ORCLPDB>select GRANTEE,PRIVILEGE from dba_sys_privs where GRANTEE='A';
no rows selected
SYS@10.10.10.1:1521/ORCLPDB>select GRANTEE,PRIVILEGE from dba_sys_privs where GRANTEE='B';
no rows selected
--新创建的用户无任何权限
--将创建会话权限授予A用户
SYS@10.10.10.1:1521/ORCLPDB>GRANT CREATE SESSION TO a WITH ADMIN OPTION;
Grant succeeded.
SYS@10.10.10.1:1521/ORCLPDB>select GRANTEE,PRIVILEGE from dba_sys_privs where GRANTEE='A';
G PRIVILEGE
- ----------------------------------------
A CREATE SESSION
--连上A用户将CREATE SESSION权限授予B用户
SYS@10.10.10.1:1521/ORCLPDB>conn a/oracle@10.10.10.1:1521/ORCLPDB
Connected.
A@10.10.10.1:1521/ORCLPDB>GRANT CREATE SESSION TO b;
Grant succeeded.
--此时查看A和B用户的权限(在具有DBA权限用户下查询,我这里是sys用户)
SYS@10.10.10.1:1521/ORCLPDB>select GRANTEE,PRIVILEGE from dba_sys_privs where GRANTEE in ('A','B');
GRANT PRIVILEGE
----- ----------------------------------------
A CREATE SESSION
B CREATE SESSION
--此时A和B都具有创建会话的权限了,测试能不能登录
SYS@10.10.10.1:1521/ORCLPDB>conn a/oracle@10.10.10.1:1521/ORCLPDB
Connected.
A@10.10.10.1:1521/ORCLPDB>show user
USER is "A"
A@10.10.10.1:1521/ORCLPDB>conn b/oracle@10.10.10.1:1521/ORCLPDB
Connected.
B@10.10.10.1:1521/ORCLPDB>show user
USER is "B"
--A和B用户都能正常登录,此时将A权限收回
SYS@10.10.10.1:1521/ORCLPDB>REVOKE CREATE SESSION FROM A;
Revoke succeeded.
SYS@10.10.10.1:1521/ORCLPDB>select GRANTEE,PRIVILEGE from dba_sys_privs where GRANTEE in ('A','B');
GRANT PRIVILEGE
----- ----------------------------------------
B CREATE SESSION
--此时A的权限被撤销了,B的权限还在。测试一下A,B的登录情况
SYS@192.168.62.1:1521/ORCLPDB>conn a/oracle@10.10.10.1:1521/ORCLPDB
ERROR:
ORA-01045: user A lacks CREATE SESSION privilege; logon denied
Warning: You are no longer connected to ORACLE.
@>conn b/oracle@10.10.10.1:1521/ORCLPDB
Connected.
B@10.10.10.1:1521/ORCLPDB>
我们发现A用户的CREATE SESSION系统权限被收回,但是B用户的CREATE SESSION系统权限没被收回
--授予A用户CREATE SESSION
SYS@10.10.10.1:1521/ORCLPDB>GRANT CREATE SESSION TO a;
Grant succeeded.
SYS@10.10.10.1:1521/ORCLPDB>select GRANTEE,PRIVILEGE from dba_sys_privs where GRANTEE in ('A','B');
GRANT PRIVILEGE
----- ----------------------------------------
A CREATE SESSION
B CREATE SESSION
--登录HR用户,将EMPLOYEES表的SELECT权限授予A用户,另赋予WITH GRANT OPTION
B@10.10.10.1:1521/ORCLPDB>conn hr/hr@10.10.10.1:1521/ORCLPDB
Connected.
HR@10.10.10.1:1521/ORCLPDB>GRANT SELECT ON EMPLOYEES TO a WITH GRANT OPTION;
Grant succeeded.
HR@192.168.62.1:1521/ORCLPDB>select GRANTOR,OWNER,TABLE_NAME,PRIVILEGE from user_tab_privs where GRANTOR ='A';
GRANTOR OWNER TABLE_NAME PRIVILEGE
---------- ---------- -------------------- ----------------------------------------
A HR EMPLOYEES SELECT
--登录到A用户将EMPLOYEES的SELECT权限授予B用户,并查询A,B的用户权限
A@10.10.10.1:1521/ORCLPDB>GRANT SELECT ON HR.EMPLOYEES TO b;
Grant succeeded.
--登录到B用户查询授权者为A的条目
A@10.10.10.1:1521/ORCLPDB>conn b/oracle@10.10.10.1:1521/ORCLPDB
Connected.
B@10.10.10.1:1521/ORCLPDB>select GRANTOR,OWNER,TABLE_NAME,PRIVILEGE from user_tab_privs where GRANTOR ='A';
GRANTOR OWNER TABLE_NAME PRIVILEGE
---------- ---------- -------------------- ----------------------------------------
A HR EMPLOYEES SELECT
--这里在B上看见一条授权者为A,对象为HR.EMPLOYEES的表的SELECT权限。测试一下权限没毛病。
B@10.10.10.1:1521/ORCLPDB>select * from hr.employees;
--登录HR用户收回HR.EMPLOYEES的SELECT权限
HR@10.10.10.1:1521/ORCLPDB>REVOKE SELECT ON EMPLOYEES FROM a;
Revoke succeeded.
--再检查A.B的权限
HR@10.10.10.1:1521/ORCLPDB>select GRANTOR,OWNER,TABLE_NAME,PRIVILEGE from user_tab_privs where GRANTOR ='A';
no rows selected
HR@10.10.10.1:1521/ORCLPDB>select GRANTOR,OWNER,TABLE_NAME,PRIVILEGE from user_tab_privs where GRANTOR ='B';
no rows
我们发现A和B的SELECT ON HR.EMPLOYEES的权限都被收回
?END!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。