Sqlserver别太信任SysComments表中的text字段
?
1、用SysComments的原因
最近新模塊的開發,需要更改和新增的存儲過程比較多,為了同步開發環境和測試環境的存儲過程,能在更新程序后,馬上能整理出更改的存儲過程腳本,并更新到測試DB服務器上,我用了SqlServer的系統表SysComments,它記錄了數據庫中所有的對象,當然包括了存儲過程,該表有個text字段,它記錄了sql定義的腳本內容,如果是存儲過程,則記錄的存儲過程腳本。用它,可以寫批量sql語句,直接幫助同步存儲過程到測試數據庫,因為為了和以后生成環境更新方式一致,需要整理出腳本,因此采用了sql語句獲取存儲過程內容的方式。
2、遇到問題
在獲取存儲過程腳本中,遇到了問題,就是更改了存儲過程名字后,通過SysComments的text字段獲取到的存儲過程內容,存儲過程名稱還是更改前的名稱,比如以前存儲過程名稱叫abc,更改為def,但查詢SysComments的text字段內容,同樣為create procedure abc。。。這樣當每次更新4,50個存儲過程,甚至更多的時候,測試系統會發生莫名其妙的問題,因為沒有真正更改到需要修改或新增的存儲過程。比如,我們先按照最后修改日期查詢出最近更改的存儲過程:
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各個版本及以下部分版本,解決方法是刪除老存儲過程,再創建新存儲過程,當然對于不從SysComments的text字段取內容的情況下,直接改名字沒什么影響。但該文章是2003年11月14日的,對現在是否有補丁或處理方式,不得而知。
?
4、總結
我本地Microsoft SQL Server 2005 - 9.00.3042.00版本的SqlServer依然有這個問題,臨時解決辦法,只有獲取內容后,再修改存儲過程名稱的方式。以后如果用sql腳本讀取SysComments的text字段來獲取存儲過程,需要注意到存儲過程名稱是否有問題。當然非腳本的手工操作,可以保證不會出現問題,選中數據庫-右鍵-任務-導出腳本。
其他非官方網站也很少搜索到相關內容,如描述有問題,請指出,謝謝!
?
轉載于:https://www.cnblogs.com/Lawson/archive/2011/05/30/2063370.html
總結
以上是生活随笔為你收集整理的Sqlserver别太信任SysComments表中的text字段的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows 下启动zookeeper
- 下一篇: 关于DOM元素