2017-10-05 10 views
2

새 Oracle 사용자를 생성하려면 JDBC를 사용해야합니다. 새 사용자의 사용자 이름과 암호는 GUI를 통해 사용자가 제공합니다. 다음 코드는 잘 작동합니다 (PreparedStatement 대신 Statement를 사용할 수도 있습니다). 사용자 이름과 암호는 사용자가 제공되기 때문에JDBC PrepareStatement 매개 변수가 CREATE, DROP, ALTER에 대해 작동하지 않습니다.

PreparedStatement preparedStatement = connection.prepareStatement("create user " + username + " identified by " + password); 
preparedStatement.execute(); 

그러나, 그들은 위의 진술이 잘못 만들 수 있습니다 등 공간, 반 열, 시세, 같은 특수 문자를 포함 할 수 있습니다. 내 코드가 사용자 이름과 암호의 유효성 검사를 수행하고 유효성 검사를 위해 Oracle에 맡기는 것을 원하지 않습니다. 따라서 나는 대신 준비된 문에서 매개 변수를 사용하는 것을 고려했다 :

PreparedStatement preparedStatement = connection.prepareStatement("create user ? identified by ?"); 
preparedStatement.setString(1, userName); 
preparedStatement.setString(2, password); 
preparedStatement.execute(); 

그러나 전혀 작동하지 않는다. 유효한 사용자 이름과 암호를 입력하면 "ORA-01935 : 사용자 또는 역할 이름이 없습니다"라는 메시지가 나타납니다. CREATE, DROP, ALTER 문에는 매개 변수가 작동하지 않는 것 같습니다. 내 문제를 해결하는 방법? 미리 감사드립니다.

답변

4

사용자 이름과 암호는 텍스트 값이 아니고 식별자입니다.

PreparedStatement 매개 변수 표식 (?)은 다양한 데이터 형식의 동적 값을 제공하는 데 사용됩니다. 식별자를 제공하는 데 사용할 수 없습니다 (예 : 동적으로 테이블 이름을 지정하려면 SELECT * FROM ?과 같은 일을 할 수 없습니다.

문자열 연결이 유일한 방법이며, 당신은 특수 문자가 포함 된 경우 바로 documentation says 같은 식별자를 (")를 인용합니다 : 암호는 알파벳이 아닌 문자로 시작하는 경우

, 또는 밑줄 (_), 달러 기호 ($) 또는 파운드 기호 (#) 이외의 문자가 들어 있으면 큰 따옴표로 묶어야합니다. 그렇지 않으면 암호를 큰 따옴표로 묶는 것이 선택 사항입니다.

+0

이제 알겠습니다. 난 그냥 정상적인 성명서를 사용해야하고 큰 따옴표로 사용자 이름과 암호를 묶어야합니다. 감사! – user3573403