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"},            
   ]  
}