我有一个我无法以任何方式修改的数据库(“DatabaseA”),但我需要检测到其中的表添加行,然后将一个日志记录添加到表中在单独的数据库(“DatabaseB”)中以及有关将行添加到DatabaseA的用户的一些信息。 (因此它需要是事件驱动的,而不仅仅是对DatabaseA表的定期扫描。)
我知道通常情况下,我可以向DatabaseA添加一个触发器,然后运行一个存储过程来将日志记录添加到DatabaseB表中。但是如何在不修改DatabaseA 的情况下执行此操作?
我有自由统治在DatabaseB做任何我喜欢的事。
编辑以回答问题/评论......
数据库A和B是MS SQL 2008 / R2数据库(标记为),用户通过专有的Windows桌面应用程序(不是我自己的)与数据库交互,每个用户都有一个与其应用程序会话相关联的SQL登录。 / p>
有什么想法吗?
答案 0 :(得分:0)
好的,所以我没有把概念证明放在一起,但这可能有效。
您可以在databaseB上配置一个扩展事件会话,该会话监视可以插入到表中的databaseA上的所有过程或者针对databaseA上的表运行的任何sql语句(使用LIKE'%表名在这里%') 。 这是一个将XE会话写入表的自定义解决方案: https://github.com/spaghettidba/XESmartTarget
您可以通过使用SQL作业代理每1分钟左右将XE事件表写入自定义用户表来模拟功能。
您的会话将监视databaseA,将XE输出写入databaseB,您编写一个触发器,在每次XE输出写入时,它将比较两个表,如果存在差异,请将差异写入日志表。这将是一个不间断的运行过程,但它在某种程度上仍然是一种周期扫描。 XE仅在事件发生时写入,但它仍然每隔几秒运行一次检查。
答案 1 :(得分:0)
我建议您查看一个可以挖掘事务日志以获取Change Data Capture事件的数据集成工具。我们最近使用StreamSets Data Collector for Oracle CDC,但它也有SQL Server CDC。还有许多其他竞争技术,包括Oracle GoldenGate和Informatica PowerExchange(不是PowerCenter)。我们喜欢StreamSets,因为它是开源的,旨在在架构级别的DB之间构建实时数据管道。到目前为止,我们已经使用了批量ETL工具,如Informatica PowerCenter和Pentaho Data Integration。如果我已经在目标中部署了DDL,我可以在一个StreamSets管道中近乎实时地复制模式中的所有表。我在Oracle和Vertica之间使用这种方法。您可以向目标添加其他列,并将它们作为管道的一部分填充。
唯一的问题可能是确定哪个用户进行了更改。我不知道这是否在SQL Server事务日志中。似乎很可能,但我不是SQL Server DBA。
答案 2 :(得分:0)
我查看了撰写本答案时提供的两种解决方案(请参阅Dan Flippo和dfundaka),但发现第一个 - 使用更改数据捕获 - 需要修改数据库,第二个 - 使用扩展事件 - 虽然它让我想到了其他选择,但它并不是一个完整的答案。
使用SQL Server Dynamic Management Views的选项似乎最干净,并且不需要任何数据库修改。在此库中,驻留在系统数据库中的是查看服务器进程历史记录的各种过程 - 在本例中为INSERT和UPDATE - 例如 sys.dm_exec_sql_text 和 sys.dm_exec_query_stats 包含数据库事务的记录(事实上,扩展事件似乎是基于什么)。
虽然最初提取所需信息是一个非常复杂的过程,但查询可以在一定程度上进行调整和推广。
交易历史记录保留等受到限制,但就本特定练习而言,这不是一个问题。
我不会选择这个答案作为正确的答案,部分原因是因为它是如何处理问题以及我还未提供完整解决方案的问题。希望我稍后再回复。但是,如果有人关心这种方法 - 好的或坏的 - 我会对你的观点感兴趣。