sql-server - 需要确定我运行的 T-SQL 查询是否正在修改任何记录而无法访问日志
问题描述
我正在寻找修改其中包含一长串存储过程的存储过程。我不确定这个过程的哪些部分会导致更新实时表。我想要做的是维护它创建的所有 tempdbs 并从中选择,但防止通过更新、插入、删除等进行任何记录更改。理想情况下,我希望能够在没有 DBA 级别权限的情况下直接从 SSMS 内部查看此信息. 我在测试数据库上运行它,所以如果有东西可以告诉我事后更改了哪些表也是合适的。然后我可以找到更新,阻止它,回滚到快照,然后再次运行它,直到它显示 0 个更改。
我尝试手动完成并通过搜索 Update、Into 和 Exec 等关键字来进行更改。但是,这涉及大量的人为判断,并为人为错误增加了很多空间。我还考虑将其包装在 begin..rollback 事务中以撤消任何意外更改,但此过程可能需要 10 分钟以上的时间才能运行,而且我不希望打开事务那么长时间。我也不完全确定在此调用的存储过程之一中没有隐藏提交 tran。
提供的任何帮助将不胜感激,谢谢。
解决方案
只要存储过程没有动态 SQL 等,您就可以使用内置实用程序递归查找任何引用的表和存储过程。此代码将显示引用的列和操作类型。我从来没有大规模使用过这个,所以一定要随时检查。
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%'
推荐阅读
- amazon-web-services - 如何配置我的 RDS postgresql 实例以便我可以与我的 API 服务器 EC2 ubuntu 机器进行交互?
- javascript - 根据 ${selectedcount} 显示不同的输出
- android - 如何阻止机器人使用谷歌登录?
- magento - 如何将 Magento 网站从一台服务器转移到另一台服务器
- c++ - 运算符重载使用运算符 + 为类模板添加
- exception - 异常向量是中断向量的更好名称吗?(在 ARM 的上下文中)
- swift - SwiftUI NavigationLink - “懒惰”的目的地?或者如何不编码重复的“标签”?
- c - 我从一位同事那里看到了一些有趣的代码。我很困惑发生了什么。它是哪个标准?我没能在 GOOGLE 中找到答案
- c++ - “警告:数组索引表达式中的逗号”但逗号分隔函数参数
- python-3.x - Opencv findCountours 函数