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와 유사하게 '@'기호를 사용하여 매개 변수 이름을 접두사로 지정할 수 있습니다.
위의 예에서는이 SqlQuerySpec의 매개 변수 속성에 할당 된이 SqlParameterCollection에 Id 매개 변수가 정의되어있는 Id별로 특정 컬렉션을 쿼리합니다. 그런 다음 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"},
]
}