Как разблокировать учетную запись пользователя Oracle из Java? - PullRequest
1 голос
/ 22 октября 2009

Я пытаюсь выяснить, почему мое приложение не может успешно разблокировать учетную запись Oracle пользователя. Вот фрагмент из моего кода:

OracleDataSource ods = new oracle.jdbc.pool.OracleDataSource();

Properties props = new Properties();
props.put("user", "sys");
props.put("password", "sys");
props.put("internal_logon", "sysdba");

ods.setConnectionProperties(props);
ods.setURL("jdbc:oracle:thin:@localhost:1523:TEST_DB");

Connection conn = ods.getConnection();
Statement stmt = conn.createStatement();
stmt.execute("ALTER USER SCOTT ACCOUNT UNLOCK");
stmt.close();

Он ни в коем случае не вызывает SQLException и не сообщает о каких-либо проблемах, но учетная запись пользователя фактически не разблокируется. Я что-то упускаю здесь очевидное или есть какой-то хитрый способ заставить это работать?

Ответы [ 8 ]

2 голосов
/ 22 октября 2009

Я бы очень нервничал из-за того, что приложение подключается как sysdba, как это.

Я бы предпочел иметь привилегированного пользователя с разрешением ALTER USER, удалить из него привилегию CREATE SESSION, и эта схема содержит процедуру account_unlock pl / sql, для которой пользователю предоставляется привилегия на выполнение, к которой подключается ваше приложение , ALTER USER - это мощная штука, и вы, вероятно, захотите ограничить атрибуты и даже отдельных пользователей, которых может изменить ваше приложение.

И это также может решить эту проблему.

1 голос
/ 22 октября 2009

Это не проблема "коммита", поскольку этот оператор не нуждается в коммите. Что нужно учитывать:

Разблокирует ли оператор эту учетную запись, когда вы запускаете ее в SQLPLUS? Вы входите в правильную базу данных из Java? Есть ли какой-либо процесс, пытающийся войти в учетную запись с неверными учетными данными, что приводит к блокировке учетной записи?

1 голос
/ 22 октября 2009

попробуйте использовать executeUpdate, а не просто выполнить. например,

stmt.executeUpdate("ALTER USER SCOTT ACCOUNT UNLOCK")
0 голосов
/ 14 августа 2012

Было бы безопаснее делать это с помощью оператора вызова, который выполняет динамический sql внутри пакета. Таким образом, вы предоставляете execute для пакета, исключая возможность атаки SQL-инъекцией

0 голосов
/ 22 октября 2009

Возможно, у вас проблема с регистром в Oracle 11?

0 голосов
/ 22 октября 2009

Хорошая новость заключается в том, что ваш код должен работать - я только что проверил его, и целевой аккаунт был разблокирован. На ум приходят два вопроса:

  • Как вы определяете аккаунт все еще заблокирован? Ты используешь ВЫБЕРИТЕ имя пользователя, account_status ОТ DBA_USERS ?

  • Существует ли профиль Oracle, который блокирует учетную запись для неудачных попыток входа? Возможно, есть другой процесс пытается и не может подключиться с неверным паролем, который повторно блокирует учетную запись.

Извините, что задаю такие базовые вопросы, но, опять же, ваш код работает.

0 голосов
/ 22 октября 2009

Попробуйте установить 'autocommit' свойство в 'true' для вашего соединения jdbc. Может быть, это просто установлено на 'false' по умолчанию, и ваш sql не зафиксирован.

0 голосов
/ 22 октября 2009

Мне было бы интересно посмотреть, решит ли это проблему:

stmt.execute («НАЧАЛО ВЫПОЛНИТЬ НЕМЕДЛЕННО» ПОЛЬЗОВАТЕЛЬ СКОТТА СЧЕТА РАЗБЛОКИРОВАТЬ; END; »);

...