Полагаю, у вас проблема с 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
свойства соединения для нового пароля .Просто поищите в Google OCINewPassword
, и он приведет вас к примерам.
С аргументами Python cx_Oracle.connect
и cx_Oracle.Connection
есть newpassword=
аргумент, который позволяет программно изменить пароль при истечении срока действия текущего.
В обоих случаях достаточно подключиться со старым паролем и установить OCINewPassword
(JDBC) или newpassword
(Python).Это приводит к тому, что рабочее соединение и пароль пользователя изменен на новый.
Таким образом, он открывает способы автоматизации смены паролей для пользователей Oracle с истекшим сроком действия.