我们在 Microsoft SQL Server 2016 Enterprise 中使用事件溯源。三年后,我们想从写入和读取模型中删除数据。公司出于隐私和合规原因要求这样做。
- Write 模型 Event Store 是
varbinary
类型的列 - 读取模型是一个类似关系数据库的 Inmon OLTP
我们想按客户订单日期的年份删除。 (例如,当前年份是 2018 年,任何 2015 年或以下)。
我相信 Write Event Store 是不可变的;只能插入,不能删除。重放事件也需要它(或者我们也可以利用 ES 快照)。
是否允许使用不可变写入事件存储规则在事件源事件中删除? MSSQL 中正确的删除规则是什么?
某些主题:
(a) 客户可以在一年后返回,我们只收集增量数据。所以我们可能需要保留一些eventstore数据。 3年规则可以变成4
(b) 此外,我们按年份删除订单日期(不同于 Etlcreatedate 和 Etlupdatedates)
最佳答案
事件存储是一种仅附加持久性。这意味着它公开的接口(interface)不包含对持久化事件的删除或更新操作;这是因为事件存储的正常操作不需要此类操作。
但是,可以迁移事件存储,更准确地说,可以在新版本的事件存储中修改它包含的事件——旧事件存储保持不变,但修改/处理的事件存储在新事件中店铺。然后,新的事件存储可以被应用程序的配置引用,旧的事件存储可以被归档或删除。
此迁移可以离线完成,使用一次性脚本。它不需要在实时系统上运行。
可以对事件进行很多转换,在 Greg's Young book 中介绍。 :复制和替换,两个聚合 - 一个流,一个聚合 - 两个流,复制 - 转换等。
在您的情况下,为了尊重隐私和合规性,您可以将包含个人客户数据的事件匿名化。例如,您可以用空格替换客户的地址、姓名或任何个人数据。通过这种方式,您不会弄乱聚合和读取模型上的事件重放。
迁移事件存储后,您应该重建所有受影响的读取模型,以确保清除所有个人/敏感/必须删除的信息。
如果您真的想删除旧事件(即早于 2014 年),那么您应该将所有这些旧事件折叠在快照类型/初始化类型事件中,这将使您的聚合处于有效的初始状态。这对于将来应该能够接收命令的聚合是必需的。
对于不应再存在的聚合,您可以删除旧事件。
附言当我说“删除”时,我的意思是您根本不会将它们复制到新的事件商店。
关于sql-server - 事件溯源 SQL Server 删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48163179/