我的表中的某些记录如何使用某列中的xyz值进行更新。在一百个存储过程,函数,触发器中,如何确定执行此操作的代码。有没有办法在数据库中搜索一些如何通过代码的每个脚本?
请帮忙。
答案 0 :(得分:3)
一种方法是检查syscomments
包含每个视图,规则的条目, default,trigger,CHECK约束, DEFAULT约束,并存储 数据库中的程序。该 text列包含原始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
这可能会帮助您找到正确的例程,或者进一步指示值来自表。
答案 1 :(得分:0)
这在SQL Server 2000中几乎是不可能的,因为更新可能来自具有该值的变量或者具有该值并且未硬编码到存储过程中的另一个表的连接,更新也可能来自DTS包,作业,应用程序运行的一段动态代码,甚至来自查询分析器,因此代码本身可能无法在任何地方记录在数据库中。
也许更好的方法可能是为相关表创建一个审计表,并让它记录用户和生成更改的spid以及旧值和新值的代码。你必须等到它再次发生,但是如果需要的话,你会确切知道改变了什么值以及将它放回去的值。
或者,您可以在系统上运行探查器,直到它发生,但探查器往往会损害性能,并且通常不是在生产系统上运行的好主意。如果它经常发生,它可能是一个可接受的替代方案。
以下是关于如何获得您所编写的最终触发器代码所需信息的提示:
create table #temp (eventtype nvarchar (1000), parameters int, eventinfo nvarchar (4000), myspid int)
declare @myspid int
select @myspid =@@spid
insert #temp (eventtype,parameters, eventinfo)
exec ('dbcc inputbuffer (@@spid)')
更新#temp 设置myspid = @myspid
选择hostname,program_name,eventinfo 来自#temp t 在t.myspid = s.spid上加入sysprocesses WHERE spid = @myspid
答案 2 :(得分:0)
您可以使用sql-profiler来跟踪给定表/列的更新。