PL/SQL system 作为sysdba登录报错

PL/SQL经常使用,有时候需要dba权限,今天登录发现报错
PL/SQL system 作为sysdba登录报错
网上的报错
PL/SQL system 作为sysdba登录报错

基本上都是一个问题:sysdba和dba没有分的清楚


dba是一种role对应的是对Oracle实例里对象的操作权限的集合,
sysdba是概念上的role是一种登录认证时的身份标识而已。


下面我们通过详细的实例来看看他们的区别

  1. 物理上的role dba 是可以在数据字典里查到的
    SQL> select * from dba_roles where upper(role) = ‘DBA’;

ROLE PASSWORD
—————————— ——–
DBA NO

而sysdba是概念上的role在数据字典里是查不到的

SQL> select * from dba_roles where upper(role) = ‘SYSDBA’;
no rows selected

  1. grant dba 和grant sysdba的差别
    dba是正真的role,所以grant后在dba_role_privs里有记录,而revoke后就没有了

SQL> grant dba to testuser;
SQL> select from dba_role_privs where grantee = ‘TESTUSER’;
GRANTEE GRANTED_ROLE ADM DEF
—————————— —————————— — —
TESTUSER RESOURCE NO YES
TESTUSER CONNECT NO YES
TESTUSER DBA NO YES
SQL> revoke dba from testuser;
SQL> select
from dba_role_privs where grantee = ‘TESTUSER’;
GRANTEE GRANTED_ROLE ADM DEF
—————————— —————————— — —
TESTUSER RESOURCE NO YES
TESTUSER CONNECT NO YES

对于sysdba是不会出现这个情况的,因为他不是正真的role
SQL> grant sysdba to testuser;
SQL> select * from dba_role_privs where grantee = ‘TESTUSER’;
GRANTEE GRANTED_ROLE ADM DEF
—————————— —————————— — —
TESTUSER RESOURCE NO YES
TESTUSER CONNECT NO YES

那么这个是sysdba是这么记录的叻,
我在一个文章和帖子里对对sysdba的登录有过详细的叙述
对了,sysdba是登录时候需要的他是和remote_login_passwordfile关联的
我们可以查询v$pwfile_users;
如下:
SQL> select from v$pwfile_users;
USERNAME SYSDB SYSOP
—————————— —– —–
SYS TRUE TRUE
SYSTEM TRUE FALSE
TESTUSER TRUE FALSE
当你grant sysdba后,在这里就多了一条
下面我们revoke一下,再来看
SQL> revoke sysdba from testuser;
SQL> select
from v$pwfile_users;
USERNAME SYSDB SYSOP
—————————— —– —–
SYS TRUE TRUE
SYSTEM TRUE FALSE

没有叻。
PL/SQL system 作为sysdba登录报错

所以在这里dba和sysdba是根本不同概念了。

参考:

https://blog.****.net/inthirties/article/details/4159489
https://bbs.****.net/topics/300231065

PL/SQL system 作为sysdba登录报错

上一篇:将waf日志导入到elasticsearch及mongodb中


下一篇:JdbcTemplate基本使用