如何跟踪数据库依赖项?

Row*_*haw 37 sql-server management

随着内部应用程序经过多年的发展,您偶尔会发现有许多人们认为不再相关并想要剔除的表。在 SQL 环境中识别数据库依赖项的实用方法是什么?

我工作过的地方采取了相当残酷的选择,例如:

  • 先删除,稍后提问(如果尝试提取不再存在的表,可能会终止数据仓库构建)
  • 首先删除权限,然后等待报告错误(如果未正确处理失败,可能会导致静默错误)

我很欣赏 SQL Server 带有用于跟踪该实例中的依赖项的工具,但是如果您在不同的实例上拥有数据库,这些工具似乎很困难。是否有可以更轻松地查询依赖项的选项,也许可以回答诸如“此列在哪里使用?”之类的问题。答案是“在此存储过程中的另一台服务器上结束”或“在此 SSIS 包中结束”?

mrd*_*nny 14

没有简单的方法可以做到这一点。触发器不起作用,就好像您从表中选择没有触发器被触发一样。我发现做到这一点的最好方法是让开发人员跟踪他们使用的内容。当某些东西要被删除时,请与所有开发团队核对,在每个人都签字后,重命名该对象。然后是没有任何中断一个月或到,对象可以安全地下降。


gbn*_*gbn 7

  1. 搜索与 sys.sql_modules.definition 一起使用的代码:是否被引用?然后...
  2. 检查权限:什么客户端代码可以调用它?然后...
  3. 探查器

因此:

  • 对于没有引用和权限的表,它没有被使用。
  • 在没有引用和一些权限的情况下,运行探查器以查看使用情况
  • 没有权限和参考,添加使用日志

我之前所做的是使表格成为掩盖表格的视图,然后使视图表现不佳:(交叉连接本身,不同)。您实际上并没有删除它,但您确实会产生客户端超时或投诉......


Mil*_*s D 6

我过去使用的一种快速方法(它实际上取决于表的大小、索引性能等)是添加一个触发器,当对表执行操作时记录时间戳。正如我所说,这可能会带来性能问题,因此需要谨慎对待 - 还要注意您的日志记录表不使用标识字段,因为这可能会搞砸一些使用 @@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)

但请注意,当服务器重新启动、分离等时,使用统计表会被清除。因此您需要设置一个作业来收集数据。我知道一些黑客。