Oracle外部用户(External User)可以访问Oracle
数据库,但该用户不需要Oracle密码验证,验证工作交由操作系统来完成。这就意味着,如果用户能通过某一用户名/密码进入操作系统,那么他就有权限访问Oracle
数据库。试想,如果一台客户机经常访问Oracle数据库,用户会非常厌烦每一次都要输入同样的用户名和口令。另外,从
安全角度考虑,每次输入用户名、口令也不太合适。
向Oracle数据库中添加外部用户
我们使用ora_server@ora_carl (ora_server是数据库所在的机器名,ora_carl是数据库的实例名)为例,来说明在Oracle中如何创建外部用户。我们假定客户端的操作系统为Windows XP,用户名是carlwu,具体步骤如下:
1) 在客户机的SQL/Plus中以系统管理员身份登陆
SQL> conn sys/manager@ora_carl as sysdba
已连接。
2)查看参数os_authent_prefix(操作系统验证前缀)参数
SQL> show parameters os_authent_prefix
NAME TYPE VALUE
------------------------------------ ---------------------------------------------------------------
os_authent_prefix string OPS$
3)创建外部用户carlwu,注意用户名前面要加上步中查出来的os_authent_prefix(操作系统验证前缀)参数值,本例中为ops$。
SQL> create user ops$carlwu identified externally;
用户已创建
4)将connect,resource权限赋给该外部用户
SQL> grant connect to ops$carlwu ;
授权成功。
SQL> exit
从Oracle9i Enterprise Edition Release 9.2.0.5.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.5.0 - Production中断开
5)在客户机上验证刚才创建的外部用户是否成功,注意在conn后省略了用户名/口令的字样,只剩下/@加上实例名。
C:\Documents and Settings\carlwu>sqlplus /nolog
SQL*Plus: Release 9.2.0.5.0 - Production on 星期五 12月 2 16:12:09 2005
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
SQL> conn /@ora_carl;
已连接。
恭喜,到现在为止,我们已经成功创建了一个Oracle外部用户。
Java程序
TestExternalUser.java源代码如下所示,testExternalUser()方法使用外部用户连接Oracle数据库
package test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class TestExternalUser {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TestExternalUser teu = new TestExternalUser();
teu.testExternalUser();
}
public void testExternalUser() {
Connection conn1 = null;
try {
conn1 = getCon();
PreparedStatement ps = conn1
.prepareStatement("select to_char(sysdate,'YYYY-MM-DD HH24:MI:SS') from dual");
ResultSet rs = ps.executeQuery();
if (rs.next()) {
System.out.println("Database server's date is:"+rs.getString(1));
}
rs.close();
ps.close();
} catch (SQLException sqle) {
sqle.printStackTrace();
} catch (ClassNotFoundException cnf) {
cnf.printStackTrace();
}finally {
closeCon(conn1);
}
}
/**
* Get target datbase's connection.
*
* @return
* @throws ClassNotFoundException
* @throws SQLException
*/
private Connection getCon() throws ClassNotFoundException, SQLException {
Connection con;
java.lang.Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection("jdbc
racle
ci:/@ora_carl");
con.setAutoCommit(false);
return con;
}
/**
* Close database connection
*
*/
private void closeCon(Connection con) {
try {
con.close();
con = null;
} catch (SQLException sqle) {
sqle.printStackTrace();
}
}
}
注意上面代码中红色字体部分Oracle连接串的写法,和普通的Oracle JDBC连接串(jdbc
racle:thin:user/pwd@server:1521:instance)的不同之处,该连接串中省略了用户名/密码。