事件采购SQL Server删除

时间:2018-01-09 07:25:18

标签: sql-server database cqrs event-sourcing

我们利用Microsoft SQL Server 2016 Enterprise中的事件采购。三年后,我们想从Write和Read模型中删除数据。公司因隐私和合规原因而要求此。

  • Write model Event Store是varbinary
  • 类型的列
  • Read模型是一个像关系数据库一样的Inmon OLTP

想按照客户订货日期删除年份。 (例如,当前年份是2018年,任何2015年或更低)。

我相信Write Event Store是不可变的;仅插入,不能删除。它也需要重放事件(或者我们也可以使用ES快照)。

是否允许使用不可变写入事件存储规则在事件源事件中删除? MSSQL中删除的正确规则是什么?

某些主题:

(a)客户可以在一年后返回,我们只收集增量数据。所以我们可能需要保留一些eventstore数据。 3年规则可以成为4

(b)此外,我们按订单日期年份删除(与Etlcreatedate和Etlupdatedates不同)

2 个答案:

答案 0 :(得分:1)

Event store是一个仅附加持久性。这意味着它公开的接口不包含对持久化事件的删除或更新操作;这是因为事件存储的正常操作不需要此类操作。

但是,可以迁移事件存储,更确切地说,可以在新版本的事件存储中修改它包含的事件 - 旧事件存储保持不变,但修改/处理的事件存储在新事件中商店。然后,应用程序的配置可以引用新的事件存储,并且可以存档或删除旧的事件存储。

可以使用一次性脚本离线完成此迁移。它不需要在实时系统上运行。

可以对事件进行大量转换,在Greg's Young book中呈现:复制和替换,两个聚合 - 一个流,一个聚合 - 两个流,复制 - 转换等。

在您的情况下,为了尊重隐私和合规性,您可以对包含个人客户数据的事件进行最大化。例如,您可以使用空格替换客户的地址,姓名或任何个人数据。通过这种方式,您不会在聚合和读取模型上重放事件。

迁移事件存储后,您应重建所有受影响的读取模型,以确保清除所有个人/敏感/必须删除的信息。

如果您确实要删除旧事件(即早于2014年),那么您应该在快照类型/ init-type事件中折叠所有那些旧事件,这会使您的Aggregates处于有效的初始状态。对于应该能够在将来接收命令的聚合,需要这样做。

对于不再存在的聚合,您可以删除旧事件。

P.S。当我说"删除"我的意思是你根本不把它们复制到新的活动商店。

答案 1 :(得分:1)

关于是否允许删除的问题,任何一方都存在争议,但最终是一个意见问题而没有一般性答案。我在实现事件采购的Axon Framework用户中对此主题(和其他人)进行了一次民意调查。一个大集团偶尔会删除事件,另一个大集团认为永远不会这样做:没有明确的赢家。

如果您希望能够根据特定事件属性(例如订单日期)删除事件,则解决方案的一部分可能是将这些字段存储为除事件有效负载之外的事件的元数据(在单独的柱)。这将允许简单有效的删除查询。

如果您想严格限制事件存储的附加属性(无删除和更新)但需要删除数据,您可以考虑加密擦除:写入时加密事件字段,将密钥存储在事件存储,在需要删除数据时删除密钥。这是我们在(商业)AxonIQ GDPR Module中实现的。