2009-10-13 114 views
0

一些如何在我的表中的某些記錄正在某個列中更新xyz的值。在數百個存儲過程,函數,觸發器中,我如何確定哪個代碼正在執行此操作。有沒有辦法通過數據庫搜索代碼的每一個腳本?SQL Server 2000:通過數據庫搜索

請幫忙。

回答

3

一種方法是檢查的syscomments

每個視圖,規則,默認 ,觸發器,CHECK約束,DEFAULT 約束和存儲 過程的數據庫內的條目。該 文本列包含原始的SQL 定義語句..

e.g. select text from syscomments 

如果您有麻煩發現文字字符串,其值可以從表中來,或者他們可以例行內被串聯。

試試這個

Select text from syscomments 
where CharIndex('x', text) > 0 
and CharIndex('y', text) > 0 
and CharIndex('z', text) > 0 

這可能會幫助你要麼找到合適的程序,或者進一步指示值從表中來。

+0

它找到了一些結果,但不是全部結果。我正在使用它。 從syscomments中選擇文本,如'%xyz%' – 2009-10-13 16:27:25

+0

這不適用於我在sql server 2000.請幫助。 – 2009-10-13 16:33:59

+0

你能舉一個它缺失的結果的例子嗎? – cmsjr 2009-10-13 16:36:35

0

這在SQL Server 2000中幾乎是不可能的,因爲更新可能來自具有該值的變量或者具有該值並且未硬編碼到存儲過程的另一個表的連接,觸發器等。更新也可能來自DTS包,作業,應用程序運行的一段動態代碼,甚至來自查詢分析器,因此代碼本身可能不會記錄在任何地方的數據庫中。

也許更好的方法可能是爲所討論的表創建一個審計表,並讓它記錄用戶和生成更改的spid中的代碼以及舊值和新值。你必須等到它再次發生,但是那時你會確切地知道什麼改變了價值,以及如果需要將價值重新投入的價值。

或者,您可以在系統上運行分析器直到它發生,但分析器往往會損害性能,並且通常不是在生產系統上運行的好主意。如果它經常發生,它可能是一個可以接受的選擇。

這裏有一個提示,你怎麼可能得到一些你想要的信息爲你寫的最終觸發代碼:

create table #temp (eventtype nvarchar (1000), parameters int, eventinfo nvarchar (4000), myspid int) 

declare @myspid int 
select @myspid [email protected]@spid 

insert #temp (eventtype,parameters, eventinfo) 
exec ('dbcc inputbuffer (@@spid)') 

更新#TEMP 集myspid = @myspid

選擇主機名,程序名,從#TEMP牛逼 eventinfo 上加入的sysprocesses小號t.myspid = s.spid WHERE SPID = @myspid

0

您可以使用SQL-Profiler來TRAC日更新給定的表格/列。