DocumentDB SQL - Được tham số hóa

Trong cơ sở dữ liệu quan hệ, truy vấn tham số hóa là truy vấn trong đó trình giữ chỗ được sử dụng cho các tham số và giá trị tham số được cung cấp tại thời điểm thực thi. DocumentDB cũng hỗ trợ các truy vấn được tham số hóa và các tham số trong truy vấn được tham số hóa có thể được thể hiện bằng ký hiệu @ quen thuộc. Lý do quan trọng nhất để sử dụng các truy vấn được tham số hóa là để tránh các cuộc tấn công SQL injection. Nó cũng có thể cung cấp khả năng xử lý mạnh mẽ và thoát khỏi đầu vào của người dùng.

Hãy xem một ví dụ mà chúng ta sẽ sử dụng .Net SDK. Sau đây là mã sẽ xóa bộ sưu tập.

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); 
}

Cấu trúc của một truy vấn được tham số hóa như sau.

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

Chúng tôi không mã hóa cứng collectionId nên phương pháp này có thể được sử dụng để xóa bất kỳ bộ sưu tập nào. Chúng ta có thể sử dụng ký hiệu '@' để đặt tên tham số tiền tố, tương tự như SQL Server.

Trong ví dụ trên, chúng tôi đang truy vấn một tập hợp cụ thể theo Id trong đó tham số Id được xác định trong SqlParameterCollection này được gán cho thuộc tính của tham số của SqlQuerySpec này. Sau đó, SDK thực hiện công việc xây dựng chuỗi truy vấn cuối cùng cho DocumentDB với collectionId được nhúng bên trong nó. Chúng tôi chạy truy vấn và sau đó sử dụng SelfLink của nó để xóa bộ sưu tập.

Sau đây là triển khai tác vụ 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"); 
   } 
}

Khi mã được thực thi, nó tạo ra kết quả sau.

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

Hãy xem một ví dụ khác. Chúng ta có thể viết một truy vấn lấy họ và trạng thái địa chỉ làm tham số, sau đó thực thi nó cho các giá trị khác nhau của họ và địa điểm.state dựa trên đầu vào của người dùng.

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

Yêu cầu này sau đó có thể được gửi đến DocumentDB dưới dạng truy vấn JSON được tham số hóa như được hiển thị trong đoạn mã sau.

{       
   "query": "SELECT * FROM Families f WHERE f.lastName = @lastName AND 
      f.location.state = @addressState", 
		
   "parameters": [           
      {"name": "@lastName", "value": "Wakefield"},          
      {"name": "@addressState", "value": "NY"},            
   ]  
}