SQL - 查找存储过程中的所有插入

时间:2015-11-06 19:35:07

标签: sql sql-server tsql

长时间的倾听者,第一次海报。我是SQL的新手,我正在尝试帮助另一位同事构建一些脚本以与测试工具一起使用。我们的目标是在更新应用程序代码后,根据一组标准检查表,以确保存储过程仍然生成预期数据。

为此(我失去了你吗?)我正试图找到一种方法来查找哪些表以及这些表中的哪些列正在由给定的存储过程更新。我找到了一个脚本,可以告诉我存储过程使用哪些表,但我找不到找到使用哪些列的方法。

这就是我查找表格的原因:

WITH stored_procedures AS (
SELECT
o.name AS proc_name, oo.name AS table_name, d.resultobj AS updated,
ROW_NUMBER() OVER(partition by o.name,oo.name ORDER BY o.name,oo.name) AS row
FROM sysdepends d 
INNER JOIN sysobjects o ON o.id=d.id
INNER JOIN sysobjects oo ON oo.id=d.depid
WHERE o.xtype = 'P' AND o.name = 'stored_procedure_here')
SELECT table_name FROM stored_procedures
WHERE row = 1 AND updated = 1 
ORDER BY proc_name,table_name 

有什么想法吗?这可能吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以创建类似“协议表”的内容,跟踪所有插入的内容。该协议表将由每次插入行时执行的Trigger填充。

CREATE TRIGGER MyTrigger ON tableName /*Name of table which will have a protocol*/
FOR INSERT
AS

INSERT INTO protocol-table (protocol_id, tableName_id,nameOfTable, GETDATE()) /*protocol_id could be an auto-generated key*/
SELECT NULL, tableName.idField,'tableName', NULL                        /*tableName_id is the ID-Field of the table you protocol*/
FROM inserted /*inserted is a "logical table". Leave this the way it is */

GO

每次对您的表格INSERT ID,此INSERT的{​​{1}}以及受此INSERT影响的表的名称都会出现在协议中

这样做的缺点:您必须为每个表执行此操作,以确保所有内容都得到协议。