当前位置:首页 > 知道中心 > ASP > 文章

开发连接远程sql server 的asp程序应注意的问题

发表于:2013-09-09| 次阅读| 作者:藕码网
TAG: asp
摘要:Microsoft SQL Server7.0是一种大型、分布式数据库系统,也可被认为是一种大型、分布式数据仓库。由于其与Windows NT和BackOffice以及Visual Studio具有紧密的配合,已被越来越多的网络应用系统所采用。而ASP程序也以其和NT的紧密连接,可使用ActiveX对象、CGI接口对象化等特点向CGI程序发起了有力的挑战。下面,就谈谈开发连接远程SQL Server 的ASP程序应注意的几个问题。

   Microsoft SQL Server7.0是一种大型、分布式数据库系统,也可被认为是一种大型、分布式数据仓库。由于其与Windows NT和BackOffice以及Visual Studio具有紧密的配合,已被越来越多的网络应用系统所采用。而ASP程序也以其和NT的紧密连接,可使用ActiveX对象、CGI接口对象化等特点向CGI程序发起了有力的挑战。下面,就谈谈开发连接远程SQL Server 的ASP程序应注意的几个问题。
   SQL Server是一个十分注重安全性的数据库,特别是在7.0版本发布以后,可以将数据库的许可直接授予Windows NT用户,数据库角色也可以包括NT 用户或组及SQL Server旧版本的用户和角色。另外,结合Microsoft Proxy Server ,则必须通过代理服务器才能在Internet 上访问SQL Server,这样更确保了数据的安全。
   在连接方案上,可选择TCP/IP套接字和命名管道的方法访问。具有NT用户帐号的用户适合于采用命名管道的方法,没有NT用户帐号的用户则不适合用此方法.。这是因为在建立连接之前,数据库用户必须被NT确认,而选择TCP/IP套接字的连接则无此限制,该连接可直接连到数据库服务器,不必通过使用命名管道的中间计算机,只要通过了SQL Server确认用户就可获得访问权。
   由于是编写数据库连接的ASP应用程序,采用的数据访问编程模式当然是ADO啦!在ADO以前的数据访问编程模式有数据访问对象DAO和远程访问对象RDO,RDODAO都是在ODBC下开发的,ODBC是用C语言编写的基于SQL的桌面规程。相反,ADO是在一种新型的规程OLE
DB下开发的,OLE DB可以被看作是OLE技术在数据库中应用。它是基于C++开发的,给ODBC的功能提供了标准化的COM接口。C++是面向对象的,因此ADO也具有面向对象的特性。并能通过一系列COM接口来扩展自己。这一点对于ASP程序来说,实在是太重要了。我们知道ASP程序使用的VBScript脚本语言的功能是很弱的,若要扩充VBScript的能力,使其能访问数据,则必须创建一个服务器端组件,通过COM接口来访问数据,而这正是ADO所擅长的。

  在编程连接网络上指定的服务器和数据库时,还必须在Web服务器上创建数据源名(DSN)。要设置一个DSN,必须给服务器提供数据库的名字、通信所用的ODBC驱动、以及在网络中的地址。要注意的是:只有设置的DSN为一个系统DSN,才能让ADO在ASP中正常工作。如何确定DSN是系统DSN而不是用户或文件DSN呢?很简单,只有对于NT服务器上的所有用户和服务都可以访问的DSN才是系统DSN。
nt color="#3366FF">  设置SQL
   SERVER的DSN很简单,只须在有IIS或PWS的机器上启动“控制面板”的“ODBC”,在“ODBC数据源管理员”对话框中选取“系统数据源名称”选项后,选取“SQL SERVER”即可。若无“SQL SERVER”,则先添加,再选取即可。这样,即使我们要变更数据库,也不必修改程序中的ODBC参数,只需重新设置系统的DSN即可。
   设计ASP程序连接SQL SERVER的另一个重要问题是实现对SQL SERVER的存取控制。由于在关系型数据库中,DBMS本身的DCL语言只支持对表和字段的存取控制,而不直接支持对表中记录提供安全性保护。为实现其安全性,同时又不失B/S结构的开放性,可以考虑采用使用中间层存取程序逻辑结合触发器的方式来实现。使用中间层存取程序即用户端程序不直接访问DBMS,而是通过一个中间层的存取程序。以网上BBS应用于为例,用户查询时,存取程序把表中的全部记录返回给用户;用户插入记录时,存取程序在新记录的User_name字段填写当前用户名,表明记录的主人,当用户删除和修改记录时,存取程序根据User_name字段向用户返回只属于他自己的记录,并允许用户从自己的记录中选择进行操作。使用触发器的方式则是所有用户直接访问表,但在表上建立如下的触发器:
CREATE TRIGGER trigger_1 on table_ 1 FOR INSERT AS
BEGIN
IF EXITS(SELECT * FROM inserted WHERE User_name$#@60;$#@62;User_name())
BEGIN
ROLLBACK TRANSACTION
RAISERROR(请输入正确的用户名,16,-1)
END
END
CREATE TRIGGER trigger_2 on table_1 FOR UPDATE,DELETE AS
BEGIN
IF EXITS (SELECT * FROM deleted WHERE User_name$#@60;$#@62;User_name())
BEGIN
RAISERROR(你不能修改他人的数据,16,-1)
END
END
   在上面的程序中,trigger_1对于用户名不正确的用户的插入请求予以否决。trigger_2对于试图修改他人的记录的请示予以否决。由于触发器附着在SQL Server的基本表中,无论用户通过何种方式更新记录,都无法跳过触发器的检查,因此使用触发器实现的安全性是相当高的。但由于在表中只能定义针对手稿删除和修改的触发器,不能定义针对查询的触发器,因此,要实现对查询的存取控制,则要通过中间层存取程序,只有向用户查询请示返回特定条件的记录来实现。


注:本站部分信息可能源于互联网分享,如有侵权,请告知,我们将及时删除!

推荐文章