[oracle] 两种权限:系统权限VS对象权限

时间:2022-05-06 03:58:38

系统权限
表示对表和表空间等   有无操作权  的权限。一般是SYS用户这种DBA来授权。比如:

grant create session to lisi
grant create table to lisi
grant unlimited tablespace lisi

对象权限
表示对 表和视图的非拥有者 赋予表和视图的使用权 的权限。一般是由表和视图的拥有者来授权。比如:
A用户可以将表tableA的权限赋予给B用户

grant select on tableA to B
gant all on tableA to B

实例:现在有俩用户 lisi 和 wangwu,为用户wangwu创建表并插入数据。

wangwu:

SQL> create table wangtab(id int);
表已创建。 SQL> insert into wangtab values(1);
已创建 1 行。 SQL> select * from wangtab; ID
----------
1

lisi访问wangtab表示访问自己创建的wangtab[实际上lisi没有wangtab这张表]

SQL> select * from wangtab;
select * from wangtab
*
第 1 行出现错误:
ORA-00942: 表或视图不存在

表示lisi用户没有wangtab这张表

lisi访问wangwu已创建的wangtab

SQL> select * from wangwu.wangtab;
select * from wangwu.wangtab
*
第 1 行出现错误:
ORA-00942: 表或视图不存在

还是报错,这是由于当前用户lisi没有访问这张表的权限。
在oracle中,各个用户的对象是隔离开的,oracle用户间默认不能访问彼此的数据,需要通过对象拥有者的授权。

SYS用户有访问oracle所有表的权限,下面我们再来看一下SYS用户能否访问wangtab

SQL> select * from wangwu.wangtab;
未选定行

这是因为wangwu在插入数据后没有执行数据的提交。

在oracle数据库中,用户在执行  新增 修改 删除数据后,需要执行提交才能将数据保存到数据库中。

wangwu:

SQL> commit;
提交完成。

这时sys再次访问就成功了

SQL> select * from wangwu.wangtab;

        ID
----------
1

下面我们用wangwu帐号登录并赋予lisi操作表wangtab的权限

//授予查询权限
SQL> grant select on wangwu.wangtab to lisi;
授权成功。

lisi:

SQL> select * from wangwu.wangtab;

        ID
----------
1
SQL> insert into wangwu.wangtab values(2);
insert into wangwu.wangtab values(2)
*
第 1 行出现错误:
ORA-01031: 权限不足 SQL> grant insert on wangwu.wangtab to lisi;
授权成功。 SQL> insert into wangwu.wangtab values(2);
已创建 1 行。

给lisi操作wangtab表的所有操作权限

SQL> grant all on wangwu.wangtab to lisi;
授权成功。 SQL> update wangwu.wangtab set id=3 where id=2;
已更新 1 行。 SQL> select id from wangwu.wangtab;
ID
----------
1
3

回收所有权限

SQL> revoke all on wangwu.wangtab from lisi;
撤销成功。 SQL> select id from wangwu.wangtab;
select id from wangwu.wangtab
*
第 1 行出现错误:
ORA-00942: 表或视图不存在

赋予所有的操作我们使用关键字all,那么赋予所有的操作给所有的用户又是怎样的命令呢?

将创建表的权限赋予给所有人
SQL> grant create any table to public;
授权成功。 将所有操作赋予所有人
SQL> grant all on wangwu.wangtab to public;
授权成功。

撤销所有人对wangtab操作的所有权限

SQL> revoke all on wangtab from public;
撤销成功。

修改表结构

修改表结构
SQL> alter table wangtab add name varchar2(10);
表已更改。 SQL> select * from wangtab; ID NAME
---------- ----------
1
3
SQL> update wangtab set name='yeqing';
已更新2行。 SQL> select * from wangtab;
ID NAME
---------- ----------
1 yeqing
3 yeqing SQL> commit;
提交完成。

在oracle中,还可以对表的某一列赋予insert和update的权限。即:对象权限可以控制到列。但是需要注意的是:查询和删除不能控制到列,查询和删除的操作是针对行的。

SQL> revoke all on wangtab from lisi;
撤销成功。 SQL> grant update(name) on wangtab to lisi;
授权成功。 SQL> grant insert(name) on wangtab to lisi;
授权成功。 SQL> update wangwu.wangtab set name='hehe' where id=1;
已更新 1 行。 SQL> update wangwu.wangtab set name='hehe',id=5 where id=1;
update wangwu.wangtab set name='hehe',id=5 where id=1
*
第 1 行出现错误:
ORA-01031: 权限不足 SQL> insert into wangwu.wangtab values(4,'hehehe');
insert into wangwu.wangtab values(4,'hehehe')
*
第 1 行出现错误:
ORA-01031: 权限不足

拓展:三个系统视图

① user_sys_privs   存储用户系统权限的视图

② user_tab_privs   存储用户对象权限的视图[表]

③ user_col_privs    存储用户对象权限的视图[列]

实例:

1、查看当前用户lisi的系统权限

SQL> select *  from user_sys_privs;

USERNAME                       PRIVILEGE                                ADM
------------------------------ ---------------------------------------- ---
PUBLIC CREATE ANY TABLE NO
LISI CREATE SESSION NO
LISI CREATE TABLE NO
LISI UNLIMITED TABLESPACE NO

2、查看当前用户lisi的对象权限

SQL> set linesize 400
SQL> select * from user_tab_privs; GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRA HIE
------------------------------ ------------------------------ ------------------------------ ------------------------------ ---------------------------------------- --- ---
LISI WANGWU WANGTAB WANGWU FLASHBACK NO NO
LISI WANGWU WANGTAB WANGWU DEBUG NO NO
LISI WANGWU WANGTAB WANGWU QUERY REWRITE NO NO
LISI WANGWU WANGTAB WANGWU ON COMMIT REFRESH NO NO
LISI WANGWU WANGTAB WANGWU REFERENCES NO NO
LISI WANGWU WANGTAB WANGWU UPDATE NO NO
LISI WANGWU WANGTAB WANGWU SELECT NO NO
LISI WANGWU WANGTAB WANGWU INSERT NO NO
LISI WANGWU WANGTAB WANGWU INDEX NO NO
LISI WANGWU WANGTAB WANGWU DELETE NO NO
LISI WANGWU WANGTAB WANGWU ALTER NO NO

3、查看lisi用户的列操作权限

SQL> select * from user_col_privs;

GRANTEE                        OWNER                          TABLE_NAME                     COLUMN_NAME                    GRANTOR                        PRIVILEGE                                GRA
------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------ ---------------------------------------- ---
LISI WANGWU WANGTAB NAME WANGWU UPDATE NO
LISI WANGWU WANGTAB NAME WANGWU INSERT NO
LISI WANGWU WANGTAB ID WANGWU INSERT NO