Oracle是否在SQL Server 2008中提供了诸如Change Data Capture之类的功能?
更改数据捕获是SQL Server 2008中的一项新功能。从MSDN:
Change data capture provides historical change information for a user table by capturing both the fact that DML changes were made and the actual data that was changed. Changes are captured by using an asynchronous process that reads the transaction log and has a low impact on the system
非常好用,不再需要手动添加CreatedDate和LastModifiedBy列。
Oracle有这样的东西吗?
解决方案
我相信Oracle从8i开始就提供了审计功能,但是用于捕获数据的表相当复杂,并且打开该表会对性能产生重大影响。
在Oracle 8i中,我们一次只能为整个数据库而不是一个表启用此功能,但是9i引入了细粒度审核,它提供了更大的灵活性。它已在10 / 11g中扩展。
有关更多信息,请参见http://www.oracle.com/technology/deploy/security/database-security/fine-grained-auditing/index.html。
同样在11g中,Oracle引入了Audit Vault,该仓库提供了安全的审计信息存储,即使DBA也无法更改此数据(根据Oracle的文档,我尚未使用此功能)。可以在http://www.oracle.com/technology/deploy/security/database-security/fine-grained-auditing/index.html上找到更多信息。
当然。实际上,Oracle根据业务需求具有许多用于此类事情的技术。
- Oracle在很长一段时间(8i天)中都使用了称为Workspace Manager的工具,使我们可以对表进行版本启用并跟踪随时间的变化。但是,这可能会有些重量级,因为它基于带有触发触发器的视图。
- 从11.1开始(作为企业版的一项额外费用选项),Oracle具有Total Recall,它可以异步挖掘重做日志以获取记录到单独表中的数据更改,然后可以使用主表上的闪回查询语法对其进行查询。 Total Recall将自动对历史数据进行分区和压缩,并在指定的数据保留期过后自动负责清除数据。
- Oracle具有LogMiner技术,该技术可挖掘重做日志并将交易呈现给使用者。然后,在LogMiner之上构建了许多技术,包括变更数据捕获和流。
- 如果目标是复制更改,则还可以使用实例化视图和实例化视图日志。
"只要我们有能力在重做日志中保持数据库的完整历史记录在线,并且永远不要将数据移至其他数据库,就可以"不再手动添加CreatedDate和LastModifiedBy列"。
我会不断添加它们,并避免依赖诸如此类的内置数据库技术。如果我们需要保留记录的历史状态,请使用审核表或者将所有内容都运送到可正确处理缓慢变化的维度的数据仓库中。
话虽如此,我还要补充一点,Oracle 10g +可以仅使用闪回查询语法来挖掘日志文件。此处的示例:http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_10002.htm#i2112847
Oracle的Datapump导出实用程序中还使用了该技术,以为多个表提供一致的数据。
Oracle具有更改数据通知,我们可以在其中向系统注册查询,并标记该查询中访问的资源以供观察。这些资源的更改由系统排队,使我们可以对数据运行proc。
使用DBMS_CHANGE_NOTIFICATION包对此进行管理。
这是有关它的信息文档:
http://www.oracle-base.com/articles/10g/dbms_change_notification_10gR2.php
如果我们是从Capp连接到Oracle,则ODP.Net(Oracles .Net客户端库)可以与"更改数据通知"进行交互,以在Oracle更改发生重大变化时提醒capp。如果我们要求我只是注册表,再也不用重复轮询数据更改,而是通过ODP.Net和wala设置更改数据通知,则仅在必要时调用cmethod。 woo!