首页 > 解决方案 > 需要确定我运行的 T-SQL 查询是否正在修改任何记录而无法访问日志

问题描述

我正在寻找修改其中包含一长串存储过程的存储过程。我不确定这个过程的哪些部分会导致更新实时表。我想要做的是维护它创建的所有 tempdbs 并从中选择,但防止通过更新、插入、删除等进行任何记录更改。理想情况下,我希望能够在没有 DBA 级别权限的情况下直接从 SSMS 内部查看此信息. 我在测试数据库上运行它,所以如果有东西可以告诉我事后更改了哪些表也是合适的。然后我可以找到更新,阻止它,回滚到快照,然后再次运行它,直到它显示 0 个更改。

我尝试手动完成并通过搜索 Update、Into 和 Exec 等关键字来进行更改。但是,这涉及大量的人为判断,并为人为错误增加了很多空间。我还考虑将其包装在 begin..rollback 事务中以撤消任何意外更改,但此过程可能需要 10 分钟以上的时间才能运行,而且我不希望打开事务那么长时间。我也不完全确定在此调用的存储过程之一中没有隐藏提交 tran。

提供的任何帮助将不胜感激,谢谢。

标签: sql-servertsql

解决方案


只要存储过程没有动态 SQL 等,您就可以使用内置实用程序递归查找任何引用的表和存储过程。此代码将显示引用的列和操作类型。我从来没有大规模使用过这个,所以一定要随时检查。

MSDN 文档

CREATE TABLE dbo.someData
(
    id INT,
    name VARCHAR(100)
)
GO

CREATE  OR ALTER PROC dbo.doSomething
AS
    SELECT name FROM dbo.someData

    UPDATE d 
    SET d.id = 2 
    FROM dbo.someData d
GO

SELECT
    --SP, View, or Function
    ReferencingName = o.name,
    ReferencingType = o.type_desc,

    --Referenced Field
    ref.referenced_database_name,   --will be null if the DB is not explicitly called out
    ref.referenced_schema_name,     --will be null or blank if the DB is not explicitly called out
    ref.referenced_entity_name,
    ref.referenced_minor_name,

    --these will tell you what it's doing
    ref.is_updated,
    ref.is_selected
FROM    
    sys.objects o
CROSS APPLY 
    sys.dm_sql_referenced_entities('dbo.' + o.name, 'Object') ref
WHERE
    o.type IN ('P')
    AND o.name LIKE '%something%'

推荐阅读