以编程方式更改过期的Oracle DB密码?

时间:2011-02-15 15:57:40

标签: passwords oracle10g

在我工作的地方,一些数据库会从我们的生产环境复制到我们的测试环境,但是DBA会在复制后立即将所有密码设置为(新)测试数据库上的所有密码,这样生产密码就不可知了。因此,如果我运行sqlplus并使用特定用户名连接到测试数据库,它会立即提示我输入新密码。

是否有办法通过Java应用程序或shell脚本自动更改特定用户的过期oracle 10g数据库密码?

2 个答案:

答案 0 :(得分:2)

在Unix上

如果您使用的是unix,则可以使用shell脚本。

我测试过它是这样的:

drop user foo cascade;
create user foo identified by old_password password expire;
grant create session to foo;
exit

现在使用这个小小脚本:

cat <<DOG | sqlplus foo/old_password
    new_password
    new_password
    exit
DOG

并使用scriptlet更改密码

sh change_expired_password.sh

然后,密码被更改,并且可以连接到实例:

sqlplus foo/new_password@ORCL

显然,您可以将cat ...构造放在适合您的shell脚本中。

在Windows上

在Windows上,你可以使用像这样的批处理文件

@(
  echo new_password
  echo new_password
) | sqlplus foo/old_password@ORCL

答案 1 :(得分:0)

我认为您遇到的问题是ORA-28001: the password has expired。由于用户的配置文件设置,它通常是ALTER USER unittest PASSWORD EXPIRE的效果或仅仅是密码过期的效果。这是相当棘手的情况。

当您与SQL*Plus连接时,它会提示您询问新密码,然后将新密码设置为:

jxa@ub16a|2014$ sqlplus unittest/unittest@//localhost/orclpdb1

SQL*Plus: Release 12.1.0.2.0 Production on Fri Dec 22 13:06:04 2017
Copyright (c) 1982, 2014, Oracle.  All rights reserved.

ERROR:
ORA-28001: the password has expired

Changing password for unittest
New password: 
Retype new password: 
Password changed

Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
UNITTEST@ORCLCDB> 

但是使用JDBC或cx_Oracle时,此异常会使您失去连接,并且无法使用它来发出ALTER USER xx IDENTIFIED BY yy REPLACE zz

所以您需要做的是删除现有连接并使用魔术设置再次重新连接。 JDBC的神奇之处在于将OCINewPassword连接属性设置为新密码。只需谷歌查看OCINewPassword,它就会让您获得示例。

使用Python,cx_Oracle.connectcx_Oracle.Connection都有newpassword=参数,允许在报告当前密码到期时以编程方式更改密码。

在这两种情况下,只需连接旧密码并设置OCINewPassword(JDBC)或newpassword(Python)即可。它通过工作连接和密码更改为新密码的用户生成。

这样就可以为过期的oracle用户提供自动更改密码的方法。