Temporal Tables PostgreSQL扩展

2021-04-11 14:45:59

时间表是记录行为有效期的时间段的表。有两种类型的时间段:应用程序周期(也称为有效时机业务 - 时间)和系统时段(也称为事务 - 时间)。

系统时段是一个列(或一对列),其系统维护值包含行从Databaseperspective有效的时间段。将行插入此类表时,系统会自动生成句点开始和结尾的值。从系统周期时间表更新ordelete行时,旧行被归档为其他表,该表被称为历史表。

应用程序时期是一个列(或一对列),其具有anapplication-valual的值,该值包含从应用程序透视图中的行无效时的时间段。此列由Anapplication填充。

请注意,对于单个事实,这两个时间段不一定是相同的。例如,您可能有一个存储有关历史或偶数事实的数据的时间表。这些事实的应用程序周期与SystemPeriod不同,当我们在表中添加或修改事实时设置的SystemPeriod。

使用Clark Dave撰写的时间TablExeQuals,有一个奇妙的Tutorialon使用和查询PostgreSQL中的时间表。

如果您正在运行Linux,则安装扩展的最简单方法即可浏览PGXN客户端。

或者,如果您愿意坚持使用良好的旧制作,您可以设置突出邮件:

您需要使用GNU Make,这可能会在您的系统上安装为Gmake: 确保您安装了pg_config和路径中的pg_config。 如果使用Apackage Management System(如RPM)安装PostgreSQL,请确保还安装了-Devel包。 如有必要,请告诉构建过程,其中tofind it: 您需要使用超级用户运行测试套件,例如默认和#34; Postgres" 超级用户: 如果您正在运行Windows,则需要在Visual Studio命令提示符中运行MSBuildCommand。 可用的平台是x64和x86,配置为9.2,9.3,9.4和9.5。 然后,您必须将DLL从项目中复制到PostgreSQL' s libdirectory和.sql和.control文件到目录共享\扩展名。 安装扩展后,您可以将其添加到数据库中。 连接到Adatabase作为超级用户,执行此操作:

必须在插入或更新或删除在Asystem-句时间表上触发功能。您要指定系统时期列名称,Ahistory表名称和"调整"参数(请参阅更新数据部分fordetail)。

要使此表系统 - 期间时间表我们应该首先添加ASYSTEM期间列:

然后我们需要一个包含我们表的存档行的历史表。创建它的最简单方法是使用like语句:

请注意,历史表不必具有与理论者相同的结构。例如,您可能希望存档原始列的某些列,但忽略其他列,或者历史表可能包含原始表中不需要某些有用的信息。 Ahistory表的唯一要求是:

历史表必须包含具有与原始文件相同的名称anddata类型的系统时期列。

如果历史表和原始历史表都包含列,则在这两个表中,此列的Thata类型必须相同。

最后,我们在我们的表格上创建一个触发器,以将其与历史表链接:

在每行执行过程版本控制(' sys_period''''雇员_history',''','',,更新或删除employees上的插入或更新或删除

对于将数据插入系统 - 周期时间表中的用户与常规表中的数据相似。例如,下列数据于2006年8月8日至表员工(桌面)是:

插入员工(姓名,部门,薪水)值('伯纳尔马克思''孵化场和调理中心' 10000);插入员工(姓名,部门,薪水)值(' Lenina Crowne''孵化场和调理中心' 7000);插入员工(姓名,部门,薪水)值('赫尔默霍尔斯沃森''情感工程学院',18500);

sys_period列的开始表示行成为当前行的时间。触发器通过使用Current_Timestamp值来生成此值,该值在其在Thecurrent事务中执行第一个数据更改语句时的时间。

当用户更新系统周期的行中列的值时,触发器将旧行的副本插入关联的历史记录中。如果单个事务对同一行进行多次更新,则会生成历史记录行。例如,以下数据在表员工中onfegrucons 27,2007更新:

当多个事务更新同一行时,可能会发生更新冲突。例如,两个事务A和B同时执行针对employees表的语句:

在时间t4,触发器必须将行的SYS_PERIOD列的开始设置为T1和将以下行插入历史表:

但是,T2>无法插入t1和行。在这种情况下,UpdateAt时间T4将失败,SQLState 22000将失败。为避免此类故障,您可以释放"调整"触发器的参数并将其设置为"真"然后,在时间t4的Startof Sys_Period列被设置为时间t2 plus增量(小时间间隔,通常等于1微秒)。经过此调整和交易A的完成后,员工表如下所示:

当用户从系统周期时间表中删除数据时,触发器addsrows到关联的历史表。例如,以下数据于2012年12月24日从表员工中丢弃:

您可能希望设置自定义系统时间才能伪造触发器。它对于从系统时间创建数据仓库是有用的,您希望使用该时间。

要将其恢复回默认行为,请使用null调用函数作为Itsargument。

如果在呈现的事务中发出set_system_time函数,则撤消所有更改。如果事务已提交,则TheChanges将持续到会话结束。

在上面的示例中,我们使用的语句创建历史表,有时会更好地使用此任务的继承。例如:

创建表员工_History(名称文本不是null,部门文本,薪资数字(20,2),sys_period tstzrange not null);

历史表始终成长,因此消耗了越来越多的洞穴。您可以使用几种方法从历史表中修剪旧数据:

使用历史表中的分区和分隔旧分区(用于表格分析上的MoreInformation,请参阅PostgreSQL文档)。

您还可以为历史表设置另一个表空间,以将其移动到DepainerStorage上。

可以使用系统周期时间表进行数据审核。 forexample,您可以添加以下触发器以保存已修改的用户的用户,该命令当前行:

创建功能员工_modify()返回触发器,因为$$开始新。 user_modified = session_user;返回新的;结束; $$语言plpgsql;创建触发器雇员_modifyBefore插入或更新Employees的每行执行过程employees_modify();创建功能员工_delete()返回触发器,因为$$开始新。 user_deleted = session_user;返回新的;结束; $$语言plpgsql;在每个行执行过程employees_delete()中,创建触发器员工_deletebefore插入

在BSD 2-Clauselicense的条款下分发时间表扩展。请参阅许可证或http://www.opensource.org/licenses/bsd-license.php formore详细信息。