Documentdb-sql-parameterized

提供:Dev Guides
移動先:案内検索

DocumentDB SQL-パラメーター化

リレーショナルデータベースでは、パラメーター化されたクエリは、プレースホルダーがパラメーターに使用され、パラメーター値が実行時に提供されるクエリです。 DocumentDBはパラメーター化されたクエリもサポートしており、パラメーター化されたクエリのパラメーターはおなじみの@表記で表現できます。 パラメーター化されたクエリを使用する最も重要な理由は、SQLインジェクション攻撃を回避することです。 また、ユーザー入力の堅牢な処理とエスケープを提供できます。

Net SDKを使用する例を見てみましょう。 以下は、コレクションを削除するコードです。.

private async static Task DeleteCollection(DocumentClient client, string collectionId) {
   Console.WriteLine();
   Console.WriteLine(">>> Delete Collection {0} in {1} <<<",
   collectionId, _database.Id);
   var query = new SqlQuerySpec {
      QueryText = "SELECT *FROM c WHERE c.id = @id",
      Parameters = new SqlParameterCollection { new SqlParameter { Name =
         "@id", Value = collectionId } }
   };

   DocumentCollection collection = client.CreateDocumentCollectionQuery(database.SelfLink,
      query).AsEnumerable().First();

   await client.DeleteDocumentCollectionAsync(collection.SelfLink);

   Console.WriteLine("Deleted collection {0} from database {1}",
      collectionId, _database.Id);
}

パラメーター化されたクエリの構築は次のとおりです。

var query = new SqlQuerySpec {
   QueryText = "SELECT* FROM c WHERE c.id = @id",
   Parameters = new SqlParameterCollection { new SqlParameter { Name =
      "@id", Value = collectionId } }
};

collectionIdをハードコーディングしていないため、このメソッドを使用してコレクションを削除できます。 SQL Serverと同様に、パラメータ名の前に「@」記号を使用できます。

上記の例では、Idによって特定のコレクションを照会しています。Idパラメーターは、このSqlQuerySpecのパラメーターのプロパティに割り当てられたこのSqlParameterCollectionで定義されています。 次にSDKは、内部にcollectionIdが埋め込まれたDocumentDBの最終的なクエリ文字列を作成する作業を行います。 クエリを実行し、SelfLinkを使用してコレクションを削除します。

以下は、CreateDocumentClientタスクの実装です。

private static async Task CreateDocumentClient() {
  //Create a new instance of the DocumentClient
   using (var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)) {
      database = client.CreateDatabaseQuery("SELECT *FROM
         c WHERE c.id = 'earthquake'").AsEnumerable().First();

      collection = client.CreateDocumentCollectionQuery(database.CollectionsLink,
         "SELECT* FROM c WHERE c.id = 'myfirstdb'").AsEnumerable().First();

      await DeleteCollection(client, "MyCollection1");
      await DeleteCollection(client, "MyCollection2");
   }
}

コードが実行されると、次の出力が生成されます。

*** *Delete Collection MyCollection1 in mydb* ***
Deleted collection MyCollection1 from database myfirstdb

*** *Delete Collection MyCollection2 in mydb* ** *
Deleted collection MyCollection2 from database myfirstdb

別の例を見てみましょう。 パラメーターとして姓と住所の状態を取得し、ユーザー入力に基づいてlastnameとlocation.stateのさまざまな値に対して実行するクエリを作成できます。

SELECT*
FROM Families f
WHERE f.lastName = @lastName AND f.location.state = @addressState

このリクエストは、次のコードに示すように、パラメーター化されたJSONクエリとしてDocumentDBに送信できます。

{
   "query": "SELECT * FROM Families f WHERE f.lastName = @lastName AND
      f.location.state = @addressState",

   "parameters": [
      {"name": "@lastName", "value": "Wakefield"},
      {"name": "@addressState", "value": "NY"},
   ]
}