2009-10-13 144 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日更新给定的表格/列。

相关问题