Row*_*haw 37 sql-server management
随着内部应用程序经过多年的发展,您偶尔会发现有许多人们认为不再相关并想要剔除的表。在 SQL 环境中识别数据库依赖项的实用方法是什么?
我工作过的地方采取了相当残酷的选择,例如:
我很欣赏 SQL Server 带有用于跟踪该实例中的依赖项的工具,但是如果您在不同的实例上拥有数据库,这些工具似乎很困难。是否有可以更轻松地查询依赖项的选项,也许可以回答诸如“此列在哪里使用?”之类的问题。答案是“在此存储过程中的另一台服务器上结束”或“在此 SSIS 包中结束”?
mrd*_*nny 14
没有简单的方法可以做到这一点。触发器不起作用,就好像您从表中选择没有触发器被触发一样。我发现做到这一点的最好方法是让开发人员跟踪他们使用的内容。当某些东西要被删除时,请与所有开发团队核对,在每个人都签字后,重命名该对象。然后是没有任何中断一个月或到,对象可以安全地下降。
因此:
我之前所做的是使表格成为掩盖表格的视图,然后使视图表现不佳:(交叉连接本身,不同)。您实际上并没有删除它,但您确实会产生客户端超时或投诉......
我过去使用的一种快速方法(它实际上取决于表的大小、索引性能等)是添加一个触发器,当对表执行操作时记录时间戳。正如我所说,这可能会带来性能问题,因此需要谨慎对待 - 还要注意您的日志记录表不使用标识字段,因为这可能会搞砸一些使用 @@IDENTITY 的旧代码。当然,它可能只是表明应用程序中的某个功能已经有一段时间没有使用了。
当所有可能访问数据库的代码都不在数据库中(即查询数据库的随机客户端)时,跟踪依赖关系是非常困难的。
编辑:为了解决表不能有 SELECT 触发器的问题,这里是另一个选项,假设您的表有索引(仅在 2008 年测试)。
SELECT
last_user_seek,
last_user_scan,
last_user_lookup,
last_user_update
FROM
sys.dm_db_index_usage_stats AS usage_stats
INNER JOIN
sys.tables AS tables ON tables.object_id = usage_stats.object_id
WHERE
database_id = DB_ID() AND
tables.name = 'mytable'
Run Code Online (Sandbox Code Playgroud)
但请注意,当服务器重新启动、分离等时,使用统计表会被清除。因此您需要设置一个作业来收集数据。我知道一些黑客。