0

オンザフライでビューを作成したい (SQL Server 2005) データベースがあります。私のコードでは、CREATE VIEW ステートメントを作成していますが、それを機能させる唯一の方法は、クエリ文字列全体を作成してそのまま実行することです。パラメータを使用したいのですが、これは:

SqlCommand cmd = new SqlCommand("CREATE VIEW @name AS SELECT @body");
cmd.Parameters.AddWithValue("@name", "foo");
cmd.Parameters.AddWithValue("@body", "* from bar");

「キーワードVIEWの近く」(おそらく「@name」)にエラーがあることを教えてくれます-言うまでもなく"CREATE VIEW foo AS SELECT * FROM bar"、チャンピオンのように機能します。

これは不可能ですか?そうでない場合、CREATE ステートメントを実行する前に入力をクリーンアップするより良い方法はありますか? 場合によっては、クエリの本文にユーザー入力が含まれている可能性があり、「これを単一の select ステートメントの本文として扱う」と言うことができる方法があれば、より安全だと思います。多分私が求めているのはあまりにも奇妙ですか?


FOLLOWUP 04 Nov: OK、はい、私が望むのは SQL インジェクションのようなものですが、このコマンドを実行してテーブルなどを削除するオプションを少なくとも最小限に抑えたいと思います (完全に削除しない場合)。 . 確かに、これを実行しているユーザーには、そもそもテーブルを削除する権限がありませんが、おわかりいただけたと思います。事実上、"This statement will not alter any existing data in any way{ ... }".

現在コード化されている方法は、 friolの回答のように文字列連結を行うことですが、それはサニタイズをまったく行いません。少なくとも、次のような疑わしい文字をスクラブできれば気分が良くなります。または-またはあなたは何を持っていますか。私は、私のためにスクラブを行うためのライブラリ関数、またはそれらの線に沿った何かがあることを望んでいました.

4

4 に答える 4

4

パラメータは単なる文字列置換ではありません。そのため、コードは機能しません。

それはあなたができないようなものです

sql = "select * from orders where orders_id in (?)"

パラメータとして「1,2,3,5」を渡します。

パラメーターは型チェックされ、スカラー値 IIRC のみを含めることができます。

于 2008-11-03T20:37:03.283 に答える
1

SQL インジェクション。あなたはそれが欲しい、それがポイントです。このようなものを連結する必要があります。

于 2008-11-03T20:44:39.993 に答える
1

たぶん私はそれを正しく理解していませんが、何ができないのですか:

viewname="foo";
viewwhere="* from bar";

SqlCommand cmd = new SqlCommand("CREATE VIEW "+viewname+" AS SELECT "+viewwhere);
于 2008-11-03T20:20:27.623 に答える
0

パラメーターを使用して動的クエリを作成しようとしているように見えますが、これはパラメーター化されたクエリが意図されている方法ではありません。それらは単に文字列に連結されるわけではありません。

防止しようとしているのが SQL インジェクションである場合、ビュー名に英数字のみが含まれ、T-SQL キーワードが含まれていないことを検証します。また、身体を動的に作成することにも非常に注意を払います。

于 2008-11-03T20:41:51.777 に答える