【问题标题】:Detect Table Changes In A Database Without Modifications无需修改即可检测数据库中的表更改
【发布时间】:2018-03-30 20:34:45
【问题描述】:

我有一个我无法以任何方式修改的数据库(“DatabaseA”),但我需要检测向其中的表添加的行,然后向表中添加一条日志记录在单独的数据库(“DatabaseB”)中以及有关将行添加到 DatabaseA 的用户的一些信息。 (所以它需要是事件驱动的,而不仅仅是定期扫描 DatabaseA 表。)

我知道通常情况下,我可以向 DatabaseA 添加一个触发器并运行一个存储过程来将日志记录添加到 DatabaseB 表中。但是如何在不修改 DatabaseA 的情况下做到这一点

我可以在 DatabaseB 中做任何我喜欢做的事情。

编辑以回答问题/cmets ...

数据库 A 和 B 是 MS SQL 2008/R2 数据库(已标记),用户通过专有的 Windows 桌面应用程序(不是我自己的)与数据库进行交互,每个用户都有一个与其应用程序会话关联的 SQL 登录名。

有什么想法吗?

【问题讨论】:

  • 您使用的是什么数据库服务器(MySQL、SQL Server、Postgres 等)?用户签名是直接与数据库交互,还是通过应用程序?
  • @JRLambert 我用这些细节更新了这个问题。谢谢。
  • 所有用户都有自己的数据库凭据吗?还是应用程序有凭据?
  • 始终指定您使用的软件版本。不同的版本有不同的功能。
  • 那么你知道所有可以插入到你想监控的表中的存储过程名称吗?

标签: sql-server sql-server-2008 sql-server-2008-r2


【解决方案1】:

好的,所以我还没有整理出概念证明,但这可能会奏效。

您可以在 databaseB 上配置扩展事件会话,以监视 databaseA 上可以插入表中的所有过程或针对 databaseA 上的表运行的任何 sql 语句(使用 LIKE '%your table name here%') . 这是将 XE 会话写入表的自定义解决方案: https://github.com/spaghettidba/XESmartTarget

您可以通过使用 SQL 作业代理每隔 1 分钟左右将 XE 事件表写入自定义用户表来模拟功能。

您的会话将监视数据库 A,将 XE 输出写入数据库 B,您编写一个触发器,在每次 XE 输出写入时,它将比较两个表,如果存在差异,则将差异写入您的日志表。这将是一个不间断运行的过程,但在某种程度上它仍然是一种周期扫描。 XE 仅在事件发生时写入,但它仍会每隔几秒运行一次检查。

【讨论】:

    【解决方案2】:

    我建议您查看一个数据集成工具,该工具可以挖掘事务日志以查找变更数据捕获事件。我们最近使用 StreamSets Data Collector for Oracle CDC,但它也有 SQL Server CDC。还有许多其他竞争技术,包括 Oracle GoldenGate 和 Informatica PowerExchange(不是 PowerCenter)。我们喜欢 StreamSets,因为它是开源的,旨在在模式级别的数据库之间构建实时数据管道。到目前为止,我们已经使用了 Informatica PowerCenter 和 Pentaho Data Integration 等批处理 ETL 工具。如果我已经在目标中部署了 DDL,我可以在一个 StreamSets 管道中近乎实时地复制一个模式中的所有表。我在 Oracle 和 Vertica 之间使用这种方法。您可以向目标添加其他列,并将它们作为管道的一部分进行填充。

    唯一的问题可能是确定是哪个用户进行了更改。我不知道这是否在 SQL Server 事务日志中。似乎有可能,但我不是 SQL Server DBA。

    【讨论】:

    • 我对这个文档的阅读表明,至少有一个设置它所需的 SP 调用对数据库进行了更改,例如 sys.sp_cdc_enable_db、sys.sp_cdc_enable_table。
    【解决方案3】:

    我查看了撰写此答案时提供的两种解决方案(请参阅 Dan Flippo 和 dfundaka),但发现第一个 - 使用 Change Data Capture - 需要修改数据库,第二个 -使用 Extended Events - 并不是一个完整的答案,尽管它让我想到了其他选择。

    看起来最简洁且不需要任何数据库修改的选项是使用SQL Server Dynamic Management Views。在这个库中,在 System 数据库中,有各种查看服务器进程历史的过程——在这种情况下是 INSERT 和 UPDATE——例如 sys.dm_exec_sql_textsys.dm_exec_query_stats包含数据库事务的记录(事实上,Extended Events 似乎是基于什么)。

    虽然最初提取所需信息是一个相当复杂的过程,但可以在一定程度上调整和概括查询。

    交易历史记录保留等方面存在限制,但就本次特定练习而言,这不是问题。

    我不会选择这个答案作为正确答案,部分原因是你如何解决问题是一个偏好问题,也因为我还没有提供完整的解决方案。希望我稍后会回复。但是,如果有人愿意对这种方法发表评论——无论好坏——我会对你的观点感兴趣。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-16
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 2017-08-04
      • 1970-01-01
      • 1970-01-01
      • 2014-10-29
      相关资源
      最近更新 更多