Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103068469
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-04-30 23:35:19

Oracle外部用户(External User)可以访问Oracle数据库,但该用户不需要Oracle密码验证,验证工作交由操作系统来完成。这就意味着,如果用户能通过某一用户名/密码进入操作系统,那么他就有权限访问Oracle数据库。试想,如果一台客户机经常访问Oracle数据库,用户会非常厌烦每一次都要输入同样的用户名和口令。另外,从安全角度考虑,每次输入用户名、口令也不太合适。


向Oracle数据库中添加外部用户


我们使用 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)将connectresource权限赋给该外部用户

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:oracle:oci:/@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:oracle:thin:user/pwd@server:1521:instance)的不同之处,该连接串中省略了用户名/密码。

阅读(407) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~