Программно изменить просроченный пароль БД Oracle? - PullRequest
3 голосов
/ 15 февраля 2011

Там, где я работаю, некоторые базы данных копируются из нашей производственной среды в нашу тестовую среду, но администраторы баз данных устанавливают срок действия всех паролей на (новой) тестовой БД сразу после копии, чтобы рабочие пароли не были известны. Поэтому, если я запускаю sqlplus и подключаюсь к тестовой базе данных с определенным именем пользователя, он немедленно запрашивает новый пароль.

Есть ли способ с помощью java-приложения или сценариев оболочки для автоматизации изменения пароля базы данных Oracle 10g с истекшим сроком действия для конкретного пользователя?

Ответы [ 2 ]

2 голосов
/ 15 февраля 2011

В Unix

Если вы работаете в Unix, вы можете сделать это с помощью сценария оболочки.

Я проверил это так:

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

и измените пароль с помощью скриптлета

sh change_expired_password.sh

Затем пароль будет изменен и его можно будет подключить к экземпляру:

sqlplus foo/new_password@ORCL

Очевидно, вы бы поместили конструкцию cat ... в подходящий вам сценарий оболочки.

В Windows

В Windows вы можете использовать пакетный файл, например

@(
  echo new_password
  echo new_password
) | sqlplus foo/old_password@ORCL
0 голосов
/ 21 декабря 2017

Полагаю, у вас проблема с 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 с истекшим сроком действия.

...