Chinaunix首页 | 论坛 | 博客
  • 博客访问: 11490601
  • 博文数量: 8065
  • 博客积分: 10002
  • 博客等级: 中将
  • 技术积分: 96708
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-16 17:06
文章分类

全部博文(8065)

文章存档

2008年(8065)

分类: 服务器与存储

2008-07-17 15:09:45

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("jdbcracleci:/@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连接串(jdbcracle:thin:user/pwd@server:1521:instance)的不同之处,该连接串中省略了用户名/密码。
阅读(297) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~