服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

深入探讨sql server 2000对xml的支持(三)


  使用xml模板进行查询

  sql server 2000通过在http请求中内嵌sql语句的功能显然是非常强大并且有用的。但是这种见也隐藏着极大的隐患,一旦某个最终用户了解了直接使用浏览器查询数据库的方法,那么数据库中的数据就很危险了,因为最终用户可能会尝试执行他自己的insert,update甚至是delete过程。

  为了维护大部分数据库中数据交易的安全,使用户不能够直接使用url进行查询,sql server 2000介绍了xml模板的概念,可以设置sql server虚拟目录把这些url查询导向那些含有所需的sql过程的xml模板中。

  在我们讨论模板概念之前,让我们重新回到sql server的iis虚拟目录管理器中,进入“设置”选项卡。为了防止用户使用http访问,我们必须把“允许 url 查询”选项给去掉。所有sql查询现在都会被导向xml模板,xpath中。

  为了允许xml模板执行sql查询,进入“虚拟名称”选项卡,并单击新建按钮,新建一个模板文件夹,取名为templates,在下拉菜单中选择template。然后,要么输入一个你的 xml模板将储存的路径或者单击“浏览”按钮。本例中使用c:inetpubwwwrootxml emplates。一旦你已经提供了所有的必要的信息,请单击“保存”按钮。

  现在一个虚拟目录已经被映射到一个指定来保存 xml查询模板的文件夹,让我们创建一个有效的 xml模板,用来执行 sql查询。下面的代码是一个模板示例。


  file2.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,当然你也可以根据你的需要改变相应的服务器名和虚拟目录名。

  让我们把这个 url拆分成单独的片段,进行分析,你可以看见,我们先使用了 northwind虚拟根,然后使用templates虚拟目录名,如前我们说过,该虚拟目录名已经映射到templates的物理目录中。最后, url给出了模板文件的名称。执行这个模板,浏览器就会把表中customers元素下嵌套的不同的订单以xml文档的形式显示出来。

  使用模板而不使用 url查询有许多优点。首先,现在一个最终用户就没有改变sql语句的权力了,去除“通过url查询访问 sql server服务器”的选项 ,就只有sql server xml isapi可以用来处理模板文件,这就避免未经授权的 插入、更新和删除程序被执行。其次, xml模板支持动态加入参数,这就允许你不用更改模板文件就可以更改一个 sql where子句的值。

  使用参数,就像插入一个 xml header元素一样简单的,在 header元素中,定义了一个 param元素,使用一个值为customerid的名称属性。这个参数被赋予一个默认值"a",你可以象在一个存储过程中一样在模板文件中使用这个参数,只要在这个参数前添加一个@,然后把它放入sql语句或用来调用一个存储过程就可以了。请见下面的代码。

<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>


  在本例中,customerid参数被一个where子句使用。如果把参数设为"b",sql 语句就会从customers和orders表中返回所有的customerid以b开头的行。调用模板并传递正确的customerid参数值,只要在查询字符串之后加上参数名和参数值,如:http://localhost/northwind/templates/file2.xml?customerid=b即可,就这么简单。

扫描关注微信公众号