通过频繁更改的架构使用Sql Server Change Data Capture


10

我们正在考虑为正在构建的新子系统启用Sql Server Change Data Capture。

这并不是真的因为我们需要它,而是因为我们具有完整的历史可追溯性而受到推动,而CDC会在我们的零件上花费最少的精力很好地解决此要求。

我们正在遵循一个敏捷的开发过程,在这种情况下,这意味着我们经常更改数据库架构,例如添加新列,将数据移动到其他列等。

我们做了一个小测试,创建了一个表,为该表启用了CDC,然后向该表中添加了新列。对新列的更改未在CDC表中注册。

是否存在将CDC表更新为新模式的机制,以及在迁移数据库模式时如何处理捕获的数据的最佳实践?


如果您在dba.stackexchange.com上发布此问题,可能会得到更好/更快的答案
TimG 2013年

2
不建议使用@TimG多点发布问题,可以选择迁移-但是它有赏金,并且在赏金有效时不能迁移。就是说,这个问题及其悬赏在dba.SE聊天室中已经提及,并引起了一些注意。

Answers:


5

我们最近也开始研究CDC。我不是该主题的专家,但是我想我对您的问题有一些答案。

在大多数情况下,CDC将帮助您实现完全可追溯的历史目标,但我认为这不会帮助您一路走来。

首先:

我们经常对数据库架构进行更改...是否存在将CDC表更新为新架构的机制

这就是我认为CDC会让您失望的地方。在MSDN文档下“了解更改跟踪开销”的部分是相当清楚的,它不会跟踪你的架构更改。例如,使用Alter Table Add Column

如果将新列添加到更改跟踪表中,则不会跟踪该列的添加。仅跟踪对新列所做的更新和更改。

Drop Column 比较复杂。

但是,您应该使用数据库脚本来更改架构,因此您不必一定要依赖CDC。这样一来,您就可以在质量检查和生产模式之间保持一致。对质量检查的更改应通过脚本执行,以便可以将完全相同的更改应用于产品。从这些脚本中提取模式更改应该并不难。这可能意味着历史记录的“时间”维度由版本而不是实际时间来驱动,但是最终结果将是相同的。

如果还没有,请创建一个表来跟踪数据库模式的版本。然后将该数据库模式版本表放在CDC下,以便您可以将宏观更改与该模式相对应于特定表中的微观更改。

据我了解,无论CDC是否未显示架构更改,您仍然应该看到添加到新列的数据。从表到表的数据迁移也应由CDC负责。

迁移数据库架构时,如何处理捕获的数据有最佳实践?

像对待审核一样对待它。您需要了解正在检查的内容,为什么要检查它以及需要保持多长时间的信息。 当涉及到这样的任务时,范围保留是两个最大的缺陷。

CDC的报告工具简直可以理解,因此您必须了解变更的背景。说“跟踪所有内容!” 太容易了。最终没有任何可用的结果。同样,通过保留每个更改的副本,您可以使数据库的大小增加一倍。在具有许多插入和删除功能的高流失表上,您最终将获得天文数字的增长。这本身并不是一件坏事,但是您需要为增长做出预算,并有一种方法可以检查所有生成的数据。

因此,这使您重新了解为什么要推动您具有完整的可追溯性。确实有此要求的正当理由。但是,除非您知道为什么必须满足该要求,否则您将无法构建对数据库的有效审核。


1

您可以使用DDL触发器跟踪列的添加。

CREATE TRIGGER trigger_name
ON { ALL SERVER | DATABASE }
[ WITH <ddl_trigger_option> [ ,...n ] ]
{ FOR | AFTER } { event_type | event_group } [ ,...n ]
AS { sql_statement [ ; ] [ ,...n ] |
EXTERNAL NAME < method specifier > [ ; ] }

您可以使用事件组DDL_TABLE_EVENTS为表的CREATE,DROP或ALTER触发。

但是,如果您使用的是Enterprise> 2008,则可能要看一下SQL Server Audit,因为它可以“将所有审核功能组合到审核规范中”。该msdn链接提供了有关它的详细文章:http : //msdn.microsoft.com/zh-cn/library/dd392015( v=sql.100) .aspx

CREATE SERVER AUDIT audit_name
TO { [ FILE (<file_options> [, ...n]) ] |
APPLICATION_LOG | SECURITY_LOG }
[ WITH ( <audit_options> [, ...n] ) ] }[ ; ]

<file_options>::=
{FILEPATH = 'os_file_path'
[, MAXSIZE = { max_size { MB | GB | TB } | UNLIMITED } ]
[, MAX_ROLLOVER_FILES = integer ]
[, RESERVE_DISK_SPACE = { ON | OFF } ] }

<audit_options>::=
{ [ QUEUE_DELAY = integer ]
[, ON_FAILURE = { CONTINUE | SHUTDOWN } ]
[, AUDIT_GUID = uniqueidentifier ]}

然后创建服务器或数据库规范。


0

Simple-Talk撰写了一篇有关更改数据捕获的出色文章,并在CDC上有一个非常详尽的指南以及MSDN文档解释了根据需求的各种方法。但是它们都可以帮助您满足您的特定要求。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.