oracle REVOKE用户权限的疑问

如下代码,我使用readonly账号,查询sys下的DUAL表,是可以查到内容的


SQL> conn readonly/password
Connected.
SQL> 
SQL> select * from sys.DUAL;

D
-
X

但是我再切换到sys用户,想取消readonly账号查询DUAL表的权限,但是提示ORA-01927: cannot REVOKE privileges you did not grant,意思应该是没有赋权限,为什么,我明明可以查询到DUAL表里的内容啊,谢谢

SQL> conn sys as sysdba
Enter password: 
Connected.
SQL> 
SQL> revoke select on sys."DUAL" from readonly;
revoke select on sys."DUAL" from readonly
*
ERROR at line 1:
ORA-01927: cannot REVOKE privileges you did not grant


【以下回答由 GPT 生成】

问题原因是因为在Oracle中,DUAL表是一个特殊的表,所有用户都默认有对DUAL表的查询权限,即使没有明确授予SELECT权限。因此,在撤销readonly用户对DUAL表的查询权限时,会提示无法撤销权限,因为没有明确授予该权限。

如果你真的需要撤销readonly用户对DUAL表的查询权限,可以使用以下步骤:

  1. 确认当前用户是sys用户:
SQL> show user;
USER is "SYS"
  1. 停止访问该表的会话,以防止出现并发问题。你可以使用以下命令查找正在访问DUAL表的会话:
SQL> select s.sid, s.serial#, p.spid, s.username, s.machine
  2  from v$session s, v$process p
  3  where s.paddr = p.addr
  4    and s.sql_id is not null
  5    and s.machine not like '%(P%)%'
  6    and s.username = 'READONLY';
  1. 杀死正在访问DUAL表的会话。假设你找到了一个会话,其SID是123和SERIAL#是456,你可以使用以下命令杀死该会话:
SQL> alter system kill session '123,456';
  1. 现在,你可以以SYS用户的身份重新连接数据库并撤销用户readonly对DUAL表的查询权限:
SQL> conn sys as sysdba
Enter password: 
Connected.
SQL> revoke select on sys."DUAL" from readonly;

这样,你就成功撤销了readonly用户对DUAL表的查询权限。请注意,由于DUAL表是Oracle系统表,建议不要轻易撤销其他用户对DUAL表的查询权限,以免影响数据库正常运行。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^