这是我通常处理更新和删除的方式。
的 源系统中的更新 强>
某些DBMS提供了一个列,如果添加到所有表中,则为仓库提供始终增加的唯一标识符。 SQL Server具有TIMESTAMP列。 Oracle提供了ora_rowscn伪列,它在块级别上表现优异。
虽然我没有使用它,但Postgres有xmin伪列,我相信它可以以类似的方式使用。有一些担忧,但我认为对于数据仓库更改跟踪目的,它可能会做到这一点。
源系统中更新上次修改日期的UPDATE触发器是另一种选择。将此日期保持在非常高的精度,以便在执行提取时,如果正在运行ODS上的大量更新,则可以降低“丢失”记录的风险。
的 在源系统中删除 强>
至于删除的记录,我的首选解决方案是确保所有源表都有一个主键(最好是一列,尽管多个是可行的)。我每天将此列的整体提取到阶段表中,然后识别目标表中与源相比“缺少”的行,更新“源已删除”标记或目标记录上的某些内容。我通常只对维度表执行此操作,因为即使原始事务已消失,事实表也应保留历史记录。
我认为在正确设计的数据仓库中不应删除或更新事实表,只能插入。然后,通过时间戳或通过某些顺序ID来捕获插入应该是微不足道的。
作为postgresql用户和开发人员,使用你所描述的触发器是-IMHO--最好的方法。让数据库按照预期的方式执行:管理和保护您的数据。使用更新日期和使用删除日期处理的逻辑删除可以更轻松地提供事务的历史记录。使用低负载时段将“已删除”数据移动到历史表有助于保持生产表的可管理性。