开发连接远程SQL Server 的ASP程序应注意的问题
文章类别:
asp | 发表日期:2008-10-5 20:53:48
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。
设置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<>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<>User_name())
BEGIN
RAISERROR('你不能修改他人的数据',16,-1)
END
END
在上面的程序中,trigger_1对于用户名不正确的用户的插入请求予以否决。trigger_2对于试图修改他人的记录的请
示予以否决。由于触发器附着在SQL Server的基本表中,无论用户通过何种方式更新记录,都无法跳过触发器的检查,因
此使用触发器实现的安全性是相当高的。但由于在表中只能定义针对手稿删除和修改的触发器,不能定义针对查询的触发
器,因此,要实现对查询的存取控制,则要通过中间层存取程序,只有向用户查询请示返回特定条件的记录来实现。