Sqlserver别太信任SysComments表中的text字段

 

1、用SysComments的原因

最近新模块的开发,需要更改和新增的存储过程比较多,为了同步开发环境和测试环境的存储过程,能在更新程序后,马上能整理出更改的存储过程脚本,并更新到测试DB服务器上,我用了SqlServer的系统表SysComments,它记录了数据库中所有的对象,当然包括了存储过程,该表有个text字段,它记录了sql定义的脚本内容,如果是存储过程,则记录的存储过程脚本。用它,可以写批量sql语句,直接帮助同步存储过程到测试数据库,因为为了和以后生成环境更新方式一致,需要整理出脚本,因此采用了sql语句获取存储过程内容的方式。

2、遇到问题

在获取存储过程脚本中,遇到了问题,就是更改了存储过程名字后,通过SysCommentstext字段获取到的存储过程内容,存储过程名称还是更改前的名称,比如以前存储过程名称叫abc,更改为def,但查询SysCommentstext字段内容,同样为create procedure abc。。。这样当每次更新450个存储过程,甚至更多的时候,测试系统会发生莫名其妙的问题,因为没有真正更改到需要修改或新增的存储过程。比如,我们先按照最后修改日期查询出最近更改的存储过程:

SELECT TOP 30 a.[name], a.crdate, a.refdate, b.[text]

from sysobjects a, syscomments b

where a.id = b.id and

 a.xtype = 'p'

ORDER BY a.refdate DESC

或者用下面的系统视图查询:

SELECT TOP 10 ir.SPECIFIC_NAME, ir.CREATED, ir.LAST_ALTERED

FROM INFORMATION_SCHEMA.ROUTINES ir

ORDER BY ir.LAST_ALTERED DESC

然后查询某一条存储过程内容:

sp_helptext UP_KERNAL_USR_SP_GetListByConsumerID

按常理,这里获取到的脚本,就可以作为该存储过程的更新脚本,但如果存储过程是更改了名称,而没有更改内容,则这个脚本的存储过程名称有可能就不正确了。经过测试,如果修改了存储过程内容,SysComments表中的text字段才会更新为正确的内容,猜测是内容有触发机制,没有更改内容就不触发同步数据到系统表存储,所以只更改名称,SysComments表中的text字段内容没有更新。

 

3、相关资料:

经过查询,发现微软官网的帮助和支持里有说明:PRB: Renaming Stored Procedure, View or Trigger does not update SYSCOMMENTS table

,具体链接:http://support.microsoft.com/kb/243198/en-us,大概说了确实有这个问题,文章并且说了该问题存在于SQL2005各个版本及以下部分版本,解决方法是删除老存储过程,再创建新存储过程,当然对于不从SysCommentstext字段取内容的情况下,直接改名字没什么影响。但该文章是20031114日的,对现在是否有补丁或处理方式,不得而知。

 

4、总结

我本地Microsoft SQL Server 2005 - 9.00.3042.00版本的SqlServer依然有这个问题,临时解决办法,只有获取内容后,再修改存储过程名称的方式。以后如果用sql脚本读取SysCommentstext字段来获取存储过程,需要注意到存储过程名称是否有问题。当然非脚本的手工操作,可以保证不会出现问题,选中数据库-右键-任务-导出脚本。

其他非官方网站也很少搜索到相关内容,如描述有问题,请指出,谢谢!

 

posted @ 2011-05-30 16:00  Lawson  阅读(4166)  评论(0编辑  收藏  举报