SQL Server 2000通過在HTTP請求中內(nèi)嵌SQL語句的功能顯然是非常強大并且有用的。但是這種見也隱藏著極大的隱患,一旦某個最終用戶了解了直接使用瀏覽器查詢數(shù)據(jù)庫的方法,那么數(shù)據(jù)庫中的數(shù)據(jù)就很危險了,因為最終用戶可能會嘗試執(zhí)行他自己的insert,update甚至是delete過程。
為了維護大部分數(shù)據(jù)庫中數(shù)據(jù)交易的安全,使用戶不能夠直接使用URL進行查詢,SQL Server 2000介紹了XML模板的概念,可以設(shè)置SQL Server虛擬目錄把這些URL查詢導(dǎo)向那些含有所需的SQL過程的XML模板中。
<Northwind xmlns:sql= "urn:schemas-microsoft-com:xml-sql"> <sql:query> SELECT Customers.CustomerID, Customers.ContactName, Orders.OrderID, Orders.CustomerID FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID FOR XML AUTO </sql:query> </Northwind>
這段代碼中使用了一個名為sql的前綴和一個URI urn:schemas-microsoft-com:xml-sql,這個前綴用來標識使用在 SQL Server XML ISAPI上的元素。有一個元素名為query,顧名思義它就是用來標記模板文件中的SQL 查詢語句。好,讓我們來演示一下如何使用這個模板吧!請在地址欄中輸入,http://localhost/northwind/templates/file2.xml,當然你也可以根據(jù)你的需要改變相應(yīng)的服務(wù)器名和虛擬目錄名。
使用模板而不使用 URL查詢有許多優(yōu)點。首先,現(xiàn)在一個最終用戶就沒有改變SQL語句的權(quán)力了,去除“通過URL查詢訪問 SQL Server服務(wù)器”的選項 ,就只有SQL Server XML ISAPI可以用來處理模板文件,這就避免未經(jīng)授權(quán)的 插入、更新和刪除程序被執(zhí)行。其次, XML模板支持動態(tài)加入?yún)?shù),這就答應(yīng)你不用更改模板文件就可以更改一個 SQL WHERE子句的值。
使用參數(shù),就像插入一個 XML header元素一樣簡單的,在 header元素中,定義了一個 param元素,使用一個值為CustomerID的名稱屬性。這個參數(shù)被賦予一個默認值"A",你可以象在一個存儲過程中一樣在模板文件中使用這個參數(shù),只要在這個參數(shù)前添加一個@,然后把它放入SQL語句或用來調(diào)用一個存儲過程就可以了。請見下面的代碼。
<Northwind xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:header> <sql:param name='CustomerID'>A</sql:param> </sql:header> <sql:query> SELECT Customers.CustomerID, Customers.ContactName, Orders.OrderID, Orders.CustomerID FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID WHERE Customers.CustomerID LIKE @CustomerID + '%' FOR XML AUTO </sql:query> </Northwind>