设为首页 收藏本站
查看: 851|回复: 0

[经验分享] 用扩展存储过程增强你的SQL Server

[复制链接]
YunVN网友  发表于 2016-11-3 07:57:07 |阅读模式
  用扩展存储过程增强你的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少了一些重要特性,不必等待下一个版本,可以自已来实现。
  
   

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-294838-1-1.html 上篇帖子: SQL Server数据库文件恢复技术(转) 下篇帖子: sql server r2 单用户--》多用户 解决方法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表