PL/SQL连接Oracle数据库ORA-12638身份证明检索失败
问题的发现与解决
我在使用PL/SQL连接Oracle数据库时显示身份证明检索失败信息,但是我通过navicat连接该数据库能够成功连接,经过研究发现把sqlnet.ora文件修改一下就可以解决该问题:
SQLNET.AUTHENTICATION_SERVICES= (NTS)
修改为
SQLNET.AUTHENTICATION_SERVICES= (BEQ,NONE)
sqlnet.ora文件的位置在 安装目录\product\11.2.0\dbhome_1\NETWORK\ADMIN\sqlnet.ora
然后我们再来研究一下sqlnet.ora文件到底起了什么作用:
sqlnet.ora文件
它简单来说就是一个Oracle的配置文件,里面有一些配置项,程序读取配置项进行一些配置,sqlnet.ora中的内容:
SQLNET.AUTHENTICATION_SERVICES= (BEQ,NONE)
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
SQLNET.AUTHENTICATION_SERVICES指定启动一个或多个认证服务
认证服务就是指Oracle的身份验证服务,你登陆Oracle时,有的时候不需要输入用户名,有的时候既需要输入用户名,也需要输入密码。那什么时候什么都不需要输入,什么时候都需要输入呢?这就和这里指定的认证服务有关系了。一般有以下三种取值:
- NONE:作用是不允许通过OS系统用户登录数据库,需要提供用户名及密码;
- ALL:作用是允许所有的登录方式;
- NTS:作用是允许本地操作系统用户认证;
- BEQ:进程间直接通信,不需要走网络监听,性能更高;
NAMES.DIRECTORY_PATH指定CLIENT NAME解析方法的次序
我们连接数据的时候,会有以下的语法格式的输入:
CONNECT username/password [@db_alias] AS [SYSOPER | SYSDBA] ;
这个db_alias就是在tnsnames.ora中定义的数据库的别名。NAMES.DIRECTORY_PATH当第一个指定为TNSNAMES时,就先到tnsnames.ora文件中去找对应的db_alias;如果找不到,就再按指定的第二种方式去找;如果都找不到,就将指定的db_alias当做主机名在网络上进行解析,得到数据库服务器的地址。