这主要基于How to version control a record in a database和http://www.sqlitetutorial.net/sqlite-trigger/: 您将需要找到有关版本控制内容和更新时间的业务规则。例如,如果客户更改了地址,您要更新/更改哪些订单。如果这些订单已在一年前完成并支付,您当然不希望使用新地址更新订单。但您肯定希望更新尚未发运的订单中的地址。但对于已经发货但尚未到达的订单,更改送货地址会给相关各方造成很多混乱。 此外,出于审计目的,您可能希望跟踪对某些数据字段的所有更改。但出于GDPR等其他监管原因,您可能希望设置此类更改的到期日期。 因此,在决定使用哪种版本化方案之前,请考虑以后在查询中将如何使用版本化。 最容易添加到现有模式的方法是为每个表mytable创建第二个表mytable_log,该表通过数据库触发器填充,并存储旧行、新行和(数据库)用户和操作。这样,应用程序对数据库所做的任何操作都会自动记录在日志中,而不会对现有查询产生太大影响。您将需要找到一种方法,通过代理用户的数据库登录名或通过其他变量或存储过程,将代理用户与数据库进行通信。 另一种方法是取消合并/当前表,并将历史和当前状态保存在同一个表中,和具有反映世界当前状态的视图。这意味着您可以完全取消数据库触发器,还可以撤消用户对表的所有删除/更新权限。缺点是您将让程序逻辑选择每个客户的最新版本(或其他),这可以通过窗口函数来完成,但会比有一个统一的表慢。此外,在这种情况下,当你从数据库中删除一行时(比如,出于GDPR的原因),你需要小心。即使一行超过10年,它仍然可能是最新的,因为没有更新的版本可用。
1条答案
按热度按时间qoefvg9y1#
这主要基于How to version control a record in a database和http://www.sqlitetutorial.net/sqlite-trigger/:
您将需要找到有关版本控制内容和更新时间的业务规则。例如,如果客户更改了地址,您要更新/更改哪些订单。如果这些订单已在一年前完成并支付,您当然不希望使用新地址更新订单。但您肯定希望更新尚未发运的订单中的地址。但对于已经发货但尚未到达的订单,更改送货地址会给相关各方造成很多混乱。
此外,出于审计目的,您可能希望跟踪对某些数据字段的所有更改。但出于GDPR等其他监管原因,您可能希望设置此类更改的到期日期。
因此,在决定使用哪种版本化方案之前,请考虑以后在查询中将如何使用版本化。
最容易添加到现有模式的方法是为每个表
mytable
创建第二个表mytable_log
,该表通过数据库触发器填充,并存储旧行、新行和(数据库)用户和操作。这样,应用程序对数据库所做的任何操作都会自动记录在日志中,而不会对现有查询产生太大影响。您将需要找到一种方法,通过代理用户的数据库登录名或通过其他变量或存储过程,将代理用户与数据库进行通信。另一种方法是取消合并/当前表,并将历史和当前状态保存在同一个表中,和具有反映世界当前状态的视图。这意味着您可以完全取消数据库触发器,还可以撤消用户对表的所有删除/更新权限。缺点是您将让程序逻辑选择每个客户的最新版本(或其他),这可以通过窗口函数来完成,但会比有一个统一的表慢。此外,在这种情况下,当你从数据库中删除一行时(比如,出于GDPR的原因),你需要小心。即使一行超过10年,它仍然可能是最新的,因为没有更新的版本可用。