于是用PL/SQL配置TNSNAMES.ORA后连接到数据库,监听,实例,都正常。system用户连接也正常,故排除oracle网络,连接的问题,但问题很明显还是数据库的权限不足。尝试用grant sysdba to system;后问题解决。但还是不太理解dba和sysdba之间的区别。下面是网上找的相关文档,如下:
dba是Oracle里的一种对象,Role 和User一样,是实实在在存在在Oracle里的物理对象,而sysdba是指的一种概念上的操作对象,在Oracle数据里并不存在。
所以说这两个概念是完全不同的。dba是一种role对应的是对Oracle实例里对象的操作权限的集合,而sysdba是概念上的role是一种登录认证时的身份标识而已。
1.
物理上的role dba 是可以在数据字典里查到的
SQL> select * from dba_roles where upper(role) = ‘DBA’;
2.
grant dba 和grant sysdba的差别
dba是正真的role,所以grant后在dba_role_privs里有记录,而revoke后就没有了
该问题源于我们现场的一个安全需求
我们想把操作系统用户root/oracle的密码改复杂,也把数据库的sys用户密码改复杂.
但是突然发现一个具有dba角色的一般用户wgmes能够修改sys的密码,也能以as sysdba 的方式登录进系统.
非常不安全,查过很多资料后才发现这几个概念原来一直都被我混淆了
0.模式(schema)与用户(user)
这组概念几乎相同,下文均以 用户 来指代
1.权限(privileges))
权限是某个用户能做的行为的定义
比如说 A用户可以 删除任何表,那么就说该用户拥有 drop any table 权限
反过来 若A用户拥有drop any table 权限,那么他就可以删除任何表格.
有些权限是针对用户对象的---比如特定表上插入数据的权限,被称为对象权限(object privileges)
另外一些权限是针对系统对象的---比如创建同义词,对表空间拥有无限配额,被称为系统权限(system privileges)
这些系统权限还有两类,一类是需要数据库被open之后才能行使的权限,比如创建表,drop表
另外一类是不需要open就可以的,比如备份,建立数据库,改归档模式等等.
常见的系统权限有:
CHANGE NOTIFICATION
ADMINISTER ANY SQL TUNING SET
ALTER ANY SQL PROFILE
CREATE RULE
EXPORT FULL DATABASE
EXECUTE ANY EVALUATION CONTEXT
DEQUEUE ANY QUEUE
DROP ANY INDEXTYPE
ALTER ANY INDEXTYPE
其中有两个极为特殊的系统权限.SYSDBA和SYSOPER,后面我再说这两个系统权限的用途.
2.角色(role)
当给某个用户赋予权限的时候,可以直接对其赋予权限.
也可以先将若干权限形成一个集合体,在将这个集合体整体赋予该用户.这里这个权限的集合体就是角色(role)
比如我们创建了两个用户A和B,都想作为平时的数据库管理员使用,
那么我们可以先创建一个角色.该角色拥有调整表空间/设置簇大小/创建索引等等一大堆系统权限,然后把该角色赋予用户A和B即可
oracle10G默认的一个dba角色就是出于该种目的而设立的角色.其带有常见管理员需要的系统权限.同时他也有SYSDBA系统权限
3.登录方式
在我们登录系统时候, sqlplus AAA/BBB@hbis 这样的命令实际上是一个简化的命令
真正的命令是 sqlplus AAA/BBB@hbis normal -1
与之相对应的 还有 sqlplus AAA/BBB@hbis as sysdba -2
或者 sqlplus sys/BBB@hbis as sysdba -3
先说第一种情况,这是normal登录方式,表明我们想用AAA用户正常登录进系统,
这个时候如果从V$SESSION 查看,是能看到AAA用户登录进来的.
而如果我们想用sys用户登录进来, 必须使用第三种方式的命令,
这里面的 as sysdba实际上是一种登录方式.由于sys用户拥有拥有全部权限.包括所有的系统权限和对象权限.
还有那些不需要open就可以行使的权限,比如备份,建立数据库,改归档模式等.
因此在使用sys用户登录时候,要求必须使用 as sysdba 来声明这次是用sys用户来行使其巨大的权限.
这个时候如果从V$SESSION 查看,是能看到SYS用户登录进来的.
而有的时候,我们想临时性的给予某个用户那些巨大的权限,那么就可以使用第二种方式.
首先先给AAA用户赋予上面提到的极为特殊的系统权限 SYSDBA 权限.
grant sysdba to AAA.
这个系统权限允许你 在登录时候 使用 as sysdba 子句来强迫系统将你识别为sys用户,从而能用AAA用户的密码来行使sys用户的那些巨大权限
然后 sqlplus AAA/BBB@hbis as sysdba
这里as sysdba 会告诉系统我将使用sys系统的那些巨大权限.
此时从V$SESSION 查看,是能看到SYS用户,而不是AAA登录进来的.
4.密码文件与用户密码
首先要知道,sys用户从实例开始就存在,也就是nomount甚至IDLE instance的时候就有了.所以这个用户的密码不能像其他用户那样放在数据库里面.
而一定要在操作系统的特定文件中,也就是database或者dbs文件夹下面的oraSID.ora文件.可以通过orapwd命令来生成.
同样,如果某个用户想通过as sysdba方式来登录,也需要存放在这个文件里.
也就是说,只有具有sysdba系统权限的用户,才会在密码文件中有记录
因此很容易猜到,在赋予或收回sysdba系统权限的时候,这个文件里面也会添加或移除该用户的记录.
而想看系统中哪些用户拥有sysdba系统权限呢,请查询select * from v$pwfile_users.
5.我们的情况
由于我们的wgmes 用户是个具有dba角色的用户,因此他可以自由的使用as sysdba方式登录进系统.然后修改sys用户的密码.很不安全
最后只好revoke了dba角色的sysdba系统权限,然后revoke了dba角色的alter user权限.
这样可以让这个wgmes用户不再去干预sys的情况.
其实我们的系统最大的问题是给一个普通用户赋予了dba角色,而现在又不知道能不能revoke这个角色,不敢轻易的行动,只好现在最紧要的地方,也就是sysdba系统权限收回来.
6.remote_login_passwordfile
最后说说这个参数
这个参数可以设置为 EXCLUSIVE NONE 和 SHARED三种,用来负责说明sys以及想通过as sysdba方式登录进系统的那些用户密码的
当设置为NONE 时候.不允许远程用户用sys登录系统 不使用密码文件登录
当设置为EXCLUSIVE 时候,允许远程以sys登录,允许非sys用户以as sysdba方式登录
当设置为SHARED 时候,允许远程以sys登录,允许非sys用户以as sysdba方式登录,不能修改密码