2017-10-05 35 views
2

JDBCを使用して新しいOracleユーザーを作成する必要があります。新しいユーザのユーザ名とパスワードは、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

これでわかりました。私は、通常のStatementを使用して、ユーザー名とパスワードを二重引用符で囲む必要があります。ありがとう! – user3573403

関連する問題