SQL表更新的原因

时间:2018-01-03 14:43:09

标签: sql-server tsql sql-server-2012

有没有办法确定如何更新表?我有一张正在更新的表,我无法弄清楚如何;通过代理工作? ssis包?触发?

我查询了dm_exec_query_stats和dm_exec_sql_text以确定正在运行的语句,但我不知道它的执行位置。

SELECT SQL_HANDLE, deqs.plan_handle, deqs.last_execution_time,
       dest.text
FROM sys.dm_exec_query_stats AS deqs
    CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest
WHERE dest.text LIKE '%Update%'
ORDER BY deqs.last_execution_time desc

3 个答案:

答案 0 :(得分:0)

将此查询用于对特定表具有insert / update / select查询的任何相关存储过程。或者,如果您在表上有一个触发插入日期时间的触发器,则可以通过检查当前运行的查询来进行分析。

需要大量挖掘任何SSIS作业计划进行表更新,通常大多数更新都是通过SP完成的。以下查询只是一个快速检查。

    SELECT DISTINCT QUOTENAME(OBJECT_SCHEMA_NAME(referencing.object_id)) + '.' + QUOTENAME(OBJECT_NAME(referencing.object_id)) AS SprocName
    ,QUOTENAME(OBJECT_SCHEMA_NAME(referenced.object_id)) + '.' + QUOTENAME(OBJECT_NAME(referenced.object_id)) AS ReferencedObjectName
    ,referenced.type_desc AS ReferencedObjectType
FROM sys.sql_dependencies d
INNER JOIN sys.procedures referencing ON referencing.object_id = d.object_id
INNER JOIN sys.objects referenced ON referenced.object_id = d.referenced_major_id
WHERE referencing.type_desc = 'SQL_STORED_PROCEDURE'
    AND referenced.type_desc = 'USER_TABLE'
ORDER BY SprocName
    ,ReferencedObjectName

答案 1 :(得分:0)

您可以使用此代码

了解您的表格是否在stored procedurefunctionviewtriggger中被引用

假设您要查找的表名为tblMyTable

SELECT DISTINCT
       o.name AS Object_Name,
       o.type_desc,
       m.*
FROM   sys.sql_modules m
  INNER JOIN sys.objects o ON m.object_id = o.object_id
WHERE m.definition Like '%tblMyTable%';

这将返回其文本中包含stored procedure的所有functionviewtrigggertblMyTable,因此即使它只是从中读取。
所以你需要检查每一个,看它是否更新。
是的,它的一些工作,但至少它给你一个变化,以确定更新是否来自数据库中的任何对象。

如果没有返回任何内容,那么您就知道必须在客户端软件中搜索。

答案 2 :(得分:0)

我知道这可能不是一个很好的方法,我可能会被烧掉,但是,这就是我所做的......

我对表执行了一个打开的事务;锁定它。

BEGIN TRANSACTION
SELECT 
    TOP 1 * 
FROM *tbl*

然后我查询了dm_exec_requests以找到正在运行的session_id

SELECT 
    sqltext.TEXT,
    req.session_id
FROM sys.dm_exec_requests req
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS sqltext

然后我查询了dm_exec_sessions以找到正在运行该会话的host_name和program_name。

SELECT 
    host_name, 
    login_time, 
    program_name 
FROM sys.dm_exec_sessions 
WHERE session_id = 184

我能够确定罪魁祸首是托管在不同服务器上的SSIS包。关闭锁定事务

感谢所有人的帮助