生产环境,通常会创建一些角色,然后将表的读写权限,授予角色再将其授予用户,简单讲就是用角色封装权限,有些很像开发中的面向对象。
同事问了个问题,
1. 将一张表读权限授予角色。
2. 将角色授予用户。 3. 删除这张表,再新建一张同名的表。 问题:用户是否有(3)这张表读权限?你可以考虑几秒,再往下看。
如果按照惯性思维来看,表名相同,应该可以读啊。
如果按理性思维来看,表名相同,字段可能不同,如果不用重新授予角色权限,就能访问,这可以说安全么?
我们看下,具体的操作结论。
- 以下使用BISAL用户来操作,创建角色、表、授予用户(必须不能是DBA角色)
SQL create role role_bisal; Role created.
SQL create table role_table (id number); Table created.
SQL grant select on role_table to role_bisal; Grant succeeded.
SQL grant role_bisal to a; Grant succeeded.
- 以下使用A用户来操作,需要重新登录,才能让角色生效
SQL select * from bisal.role_table;
no rows selected- 以下使用BISAL用户来操作,删除这表,但不执行purge
SQL drop table role_table; Table dropped.
SQL select object_name, original_name, type from user_recyclebin;
创建一张同名表,
SQL create table role_table (id number); Table created.
- 以下使用A用户来操作
SQL select * from bisal.role_table;
select * from bisal.role_table;
*
ERROR at line 1
ORA-00942: table or view does not exist
说明仅仅是同名,需要重新授权,其实这是符合常理的,毕竟表名相同,未必代表相同的含义和用途,如果仅凭借表名,角色就可以访问,这就不正确了。
- 我们看看,是否可以恢复表的访问,以下使用BISAL用户来操作,使用purge删除新表role_table
SQL drop table role_table purge; Table dropped.
我们从回收站,恢复了这张表,注意此处,改了表名role_table_b。
SQL flashback table "BIN$aBKyCdQRUKXgUxqT3QovvQ==$0" to before drop rename to role_table_b; Flashback complete.
- 以下使用A用户来操作,此时可以直接访问表,
SQL select * from bisal.role_table_b;
no rows selected.
当然,我们将表改为原名称,
SQL rename role_table_b to role_table;
Table renamed.
就可以用此名访问了,
SQL select * from bisal.role_table;
no rows selected.
因此,以下三步操作,用户不会有这张同名表,任何使用权限,但若原表可恢复,例如回收站中,则可以继续访问,只要表物理存在,即使表名变了,
将一张表读权限授予角色。
将角色授予用户。
删除这张表,再新建一张同名的表。
可能仅从理论上,就能得出这样的结论,但经过一些测试,可以加深我们的理解,何况并不复杂。
如果您觉得本文有帮助,欢迎关注转发:bisal的个人杂货铺,