2009-10-22 4 views
1

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

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 или сообщать о любых проблемах, но учетная запись пользователя не реально получить разблокирована. Я пропустил что-то очевидное здесь или есть какой-то хитрый способ заставить это работать?

+0

Что такое версия базы данных? Вы пытались выполнить команду в SQL Plus? – Guru

+0

Oracle 10g, оператор отлично работает в SQL * Plus. – ninesided

ответ

2

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

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

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

+1

Я полностью согласен, к сожалению, у меня есть специальное требование, которое требует такого подхода. Приложение предназначено как простой инструмент поддержки, и только когда-либо сможет заблокировать/разблокировать учетную запись пользователя и изменить пароль пользователя. – ninesided

+0

Я изменил приложение, чтобы использовать привилегированного пользователя, а не подключаться как sysdba, как вы предложили, я выяснил другой способ удовлетворения других требований, которые потребовали использования sysdba. Пока я не могу объяснить, почему он не работал раньше, он делает это сейчас. Та очень! – ninesided

0

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

stmt.execute ("BEGIN EXECUTE немедленного 'ALTER USER SCOTT СЧЕТ РАЗБЛОКИРОВАТЬ; END;");

+0

К сожалению нет. Он запускается, но не влияет на изменение статуса учетной записи. – ninesided

1

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

stmt.executeUpdate("ALTER USER SCOTT ACCOUNT UNLOCK") 
+0

Я думал, что вы могли бы что-то здесь придумать, но это не имеет значения ... – ninesided

0

Попробуйте установить '' AutoCommit свойство 'истинный' для соединения JDBC. Может быть, он просто установлен на «false» по умолчанию и ваш sql не установлен.

+0

комманда не требуется для ПОЛЬЗОВАТЕЛЯ ALTER – ninesided

1

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

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

+0

Спасибо за совет. Заявление отлично работает в SQL * Plus, я проверил детали подключения для базы данных в течение десятков раз, и это, безусловно, правильная база данных, и нет других процессов, которые могли бы сделать это изменение, отличное от того, которое я пытаюсь проверить. – ninesided

0

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

  • Как вы определить счет все еще заперта? Используете ли вы SELECT username, account_status FROM DBA_USERS?

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

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

0

Возможно, вы столкнулись с проблемой чувствительности к регистру с Oracle 11?

0

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

+2

Разве это не то, что рекомендовал принятый ответ? –