2011-08-11 5 views
10

私は昨日のユーザーグループ会議に参加していましたが、パラメータ化クエリを使用する方がクエリをハッキングするよりも優れていると指摘しました。対照的にこれらの2つのクエリ間のベストプラクティス

DECLARE @Client1 UNIQUEIDENTIFIER, 
@Client2 UNIQUEIDENTIFIER 
SET @ClientId1 ='41234532-2342-3456-3456-123434543212'; 
SET @ClientId2 = '12323454-3432-3234-5334-265456787654'; 

SELECT ClientName 
FROM dbo.tblclient 
WHERE id IN (@Client1,@Client2) 

:それは、これが(このけれどもよりもはるかに大きい規模で明らかに)有益な何かをするん、思考に私を得たことを傷つけるべきではありません

SELECT ClientName 
FROM dbo.tblclient 
WHERE id IN ('41234532-2342-3456-3456-123434543212','12323454-3432-3234-5334-265456787654') 
+2

質問の最初の文にはの意味があります。私は[ママの悪用](http://xkcd.com/327/)に精通していますが、私は他の主張には多少疑念があります。 –

答えて

4

INリストが随時変更された場合、パラメータ付きクエリとIN句は、実際にはほとんど一緒に実装されません。

このSO質問と回答を読む:Parameterize an SQL IN clause

パラメータは、設計によって、一つの値のみです。 SQL Injectionのようなセキュリティ上の問題を念頭に置いて、それ以外のものはすべて手動で実装する必要があります。

パフォーマンスの観点から、特に同じクエリが繰り返し実行されていてもパラメータ値が異なる場合は、パラメータ化されたクエリのパフォーマンスが向上します。しかし、動的なINリスト(時には2つのアイテム、時には3つのリスト)がある場合、パラメータ化されたクエリを使用する利点が得られないことがあります。

しかし、希望を失うことはありません。いくつかの人々がそれを実装することができました(ParametrizedクエリとIN句)。しかし、それはやっかいなことではありません。

1

が、あなた」ユーザー入力によって生成された照会を使用するときは、プリペアド・ステートメントから最大の効果を得ようとします。彼らがボタンをクリックして「すべてを表示」しても大したことではありません。ただし、ユーザーが名前を入力するように求めている場合は、挿入/更新/選択する前に入力をパラメータ化する必要があります。

たとえば、「Mike DROP TABLE MASTER」と入力した場合、またはあなたのDBに大きなテーブル名が何であれ、それはあなたのために本当に醜いことができます。申し訳ありませんが、より安全ですよね?

EDIT:OPがここにコメントして質問されました。コード例で更新されました。

データベースで作業する前にコードが入力を整数に強制する方法を参照してください。そうすれば、誰かが何かの偽善をしようとするとDBに害を及ぼす前に拒否されます。

+0

私は彼がSQLインジェクションのリスク以上のパフォーマンスの観点から求めていると思います。 – JNK

+0

Ah。その場合、私は削除します。説明をありがとう。 – rownage

+0

正直なところ、OPまで。私が質問から得たもの。 – JNK

1

多数の結合を持つ巨大なデータベースおよび複雑なクエリでは、データベースは実行計画を作成する時間を使用できます。パラメータ化されたクエリを使用する場合、異なるパラメータでクエリを複数回呼び出すときに、実行計画はしばらくの間データベースキャッシュにとどまります

関連する問題