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