用扩展存储过程增强你的SQL Server

用扩展存储过程增强你的SQL Server(四) 
程序员之家 作者:不详 日期:2002-4-14 2:04:00

--------------------------------------------------------------------------------
 


让XPRunComp运作起来

要使用任一新的扩展存储过程,首先得用SQL Server的内置存储过程sp_addextendedproc或通过SQL Server管理器注册它。sp_addextendedproc有两个参数:函数句和DLL句。使用图形界面的SQL Server管理器,首先在SQL Server管理树上打开databases-master-objects目录,双击Extended stored procedures目录,在弹出式菜单上选择New。在接着出现的对话框中,指定扩展存储过程句和DLL句。DLL必须放在系统路径下的某个地方(我喜欢放在winnt\system32目录下)。任何一个Windows C++程序员都能猜出SQL Server内部是怎样处理扩展存储过程的。当解析器在SQL语句中遇到扩展存储过程名时,它就查找这个输出函数是在那个DLL中实现的。解析器能够这样做是因为你在注册存储过程sp_addextendedproc时在第二个参数中提供了DLL名。然后SQL Server用Windows API函数LoadLibrary()装入DLL,调用GetProcAddress()取得指定函数的地址。

当你注册了XPRunComp,可用ISQL或用企业管理器中的SQL Query测试它。记住如果在master数据库外的数据库调用它时你必须将"master"数据库名指定为扩展存储过程名的一部分。我是这样调用的:exec master..XPRunComp。这里并没指定存储过程的拥有者;因此多了一个点。

当用XPRunComp运行你的组件时要清楚与Windows NT相关的安全问题。特别是由于SQL Server是以默认的系统帐号安全属性运行的,它不能访问你的网络驱动器。因此,所有对ActiveX自动化服务器调用必须本地存储,除非你改变SQL Server服务的默认登录帐号。

当在触发器中使用XPRunComp时,可能会碰到一个有趣的关于SQL Server锁定的问题。在SQL事务期间要读或修改的资源上保持锁定以防止多个事务并发使用的问题。 微软的SQL Server能够页面锁定及行级锁定。最常见的锁定类型是2K数据及索引页锁定。

我们来看看触发器的情况,你用XPRunComp调用OLE自动化对象中的方法,此对象创建与SQL Server的连接并试图在触发触发器的同一表中更新或插入一条记录。而且,假定记录与引起触发器的记录在同一页面上。如果锁定是页面级的,这种情况将导致SQL Server无法解决的锁定。一句话,这儿有两个在同一时间访问同一页面的进程。第一个进程(触发器)等待直到第二个进程(由OLE自动化对象中的SQL语句创建)退出。第二个进程等待第一个进程释放锁定。SQL Server在这种情况下甚至不返回错误信息-它只是永远等待。可通过在触发器中调用XPRunComp前加上提交(commit)语句来解决此问题。此举释放了页面上的锁定,使得第二个进程能够执行其所要求的数据库操作。

如果在ISQL应用程序中用XPRunComp调用对象方法,可在对象方法代码中显示一个用于测试的消息框。例如,假定你的OLE对象Mycomp.Class1有一个方法ShowMe,此方法显示传递给它的文本串。完整的调用" exec XPRunComp 'MyComp.Class1','Showme','This is a test'使ISQL显示含有给定文本的消息框。要注意如果在SQL Server中未设置Allow Service to Interact with Desktop选项,在触发器中包含这样的代码将使它挂起。显示,应避免在触发器调用需要用户输入的方法。这不是触发器设计的初衷。

总结

怎样改进XPRunComp 呢? 你可能注意到我只实现了对最常用的SQL Server类型的支持。如果传进一个不受支持的类型,扩展存储过程返回一错误信息。要增运支持未受支持的类型,需要修改ParseParameters()和AssignOutputParams()函数。

或许你还创建几个分立的扩展存储过程来创建一个COM对象,执行它的方法并释放它。这种情况下,你可调用一个存储过程(XPCreateComp)来创建它,多次调用另一个过程(XPRunComp)执行对象方法。最后释放对象(XPReleaseComp)。这种设计更为有效,因为你不必在每次执行其方法时都创建一个COM对象。你可以在同一个DLL中实现所有这三个过程。

通过创建用户定义的扩展存储过程来扩展SQL Server功能的能力使得你做为一个SQL程序员能够访问系统服务,内存,硬件。如果你觉得SQL Server少了一些重要特性,不必等待下一个版本,可以自已来实现。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值