2011-12-08 15 views
1

状況によっては、特定の時点でDBパーティションを作成する必要があります。私は次のようなStatementを使用しています:これは正常に動作し、私が期待するまさにん準備済みステートメントを使用してLONGデータ型を設定する

alter table table_name split partition default_partition values (' + 
id + ') into ( partition " + partitionName + ", partition 
default_partition) update indexes 

。ただし、idという値は、権限のない人が潜在的にアクセスできる入力から発生します。したがって、上記の文はの攻撃に対して脆弱なです。 PreparedStatementを使用したいと思いますが、どうしたらよいかわかりません。

問題は、oracleのパーティション表がLONGのHIGH_VALUE列に "id"の値を設定することです。これを行うための適切な設定がない(Stringは機能しないので)。私は、無駄な値としてStringReaderByteArrayInputStreamの両方を使用して、さまざまなストリームメッセージを使用しようとしました。私はロングがもう使用されるはずではないことを知っていますが、それはオラクルが持っている方法なので、実際にはそれを回避することはできません。

ORA-14308: partition bound element must be one of: string, datetime or interval literal, number, or NULL 

OracleのドキュメントをLONGを取得する方法について良い情報を持っている(LOBのようなものであるOracleデータ型、):

私はそれらのいずれかの方法で試してください、これは私が得るものですそれを設定する方法ではありません。誰も私にこれを手伝ってもらえますか?また、JDBCドライバのOracle実装についても見てきましたが、setLONG型のメソッドもないようです。私はこれを行う方法がありますか?

+0

おそらく私は何かが不足していますが、PreparedStatementに 'setLong(int、long)'というメソッドがあると考えました。 http://docs.oracle.com/javase/6/docs/api/java /sql/PreparedStatement.html これは機能しませんか? – hooknc

+0

はい、LONG Oracleタイプは基本的にLOBです。だから、Javaほど長くはない。 – AHungerArtist

+0

OracleのLONGは文字データ(愚か者)なので、 'setString(int、id.toString())'を試してみましたか?どんなセットメソッドを試しましたか? – Gray

答えて

5

DDLでバインド変数を使用することはできません。 PreparedStatementを使用してDDLステートメントのsetXXXXメソッドを呼び出すことはできません。

ユーザー入力に基づいてオンザフライでパーティションを分割することは、少なくとも非常に珍しい設計です。私は、interval partitioningのようなものを提供する方が良いと思われる傾向があります.Oracleでは、必要なときに新しいパーティションを作成したり、レンジ・パーティション化ではなくハッシュ・パーティション化を行います。ただし、手動で新しいパーティションを作成するのが本当に意味があると仮定すると、SQL注入を防ぐために 'id'と 'partitionName'の値が有効であることを検証するコードを記述する必要があります。

+0

まあ、私は物事を単純化しようとしていました。どのユーザーもこれを行うことはできません。これはかなり制限されますが、少数のユーザーが腐ってしまったり、誰かが別の方法でアクセスしたりする場合に備えて、保護されていることを確認したいと思っています。私は、たとえそれがPSの保証ではないとしても、検証ルートを使用します。ありがとう。 – AHungerArtist

0

idが文字列かどうかは、その前に検証してください。

try { 
     id = Long.valueOf(unsafeId); 
     //do more validations here 
    } catch (NumberFormatException e) { 
     throw new RuntimeException("Not a valid input."); 
    } 
+0

実際にはロングではありません。型は、db内でLONGです。これは実際にはcharデータです。さらに、有効なIDが取ることのできるフォームは変更されています(idは悪い名前ですが、実際の名前を例のために置き換えています)。 – AHungerArtist

関連する問題