在我工作的地方,一些数据库会从我们的生产环境复制到我们的测试环境,但是DBA会在复制后立即将所有密码设置为(新)测试数据库上的所有密码,这样生产密码就不可知了。因此,如果我运行sqlplus并使用特定用户名连接到测试数据库,它会立即提示我输入新密码。
是否有办法通过Java应用程序或shell脚本自动更改特定用户的过期oracle 10g数据库密码?
答案 0 :(得分:2)
如果您使用的是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上,你可以使用像这样的批处理文件
@(
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.connect
和cx_Oracle.Connection
都有newpassword=
参数,允许在报告当前密码到期时以编程方式更改密码。
在这两种情况下,只需连接旧密码并设置OCINewPassword
(JDBC)或newpassword
(Python)即可。它通过工作连接和密码更改为新密码的用户生成。
这样就可以为过期的oracle用户提供自动更改密码的方法。