Amazon QLDB 允许通过 ID 查询特定对象的版本历史。但是,它也允许删除对象。似乎可以通过删除和创建新对象而不是更新对象来绕过版本控制。
例如,假设我们需要通过 VIN 跟踪车辆登记。
INSERT INTO VehicleRegistration
<< {
'VIN' : '1N4AL11D75C109151',
'LicensePlateNumber' : 'LEWISR261LL'
} >>
然后,我们的应用程序可以通过以下查询获取 VIN 的所有 LicensePlateNumber 分配的历史记录:
SELECT * FROM _ql_committed_VehicleRegistration AS r
WHERE r.data.VIN = '1N4AL11D75C109151';
这将返回所有未删除的文档修订,给我们一个不可伪造的历史。history
如果您记住插入的文档 ID,则可以类似地使用该函数。但是,如果我想恶意绕过历史记录,我只需删除该对象并重新插入即可:
DELETE FROM VehicleRegistration AS r WHERE VIN = '1N4AL11D75C109151';
INSERT INTO VehicleRegistration
<< {
'VIN' : '1N4AL11D75C109151',
'LicensePlateNumber' : 'ABC123'
} >>
现在没有记录表明我修改了这个车辆登记,违背了 QLDB 的全部目的。新记录的文档 ID 将与旧记录不同,但 QLDB 无法告诉我们它已更改。我们可以使用单独的系统来跟踪文档 ID,但现在其他系统将成为权威系统,而不是 QLDB。我们应该使用 QLDB 来构建这些类型的权威记录,但是其他系统会遇到完全相同的问题!
如何使用 QLDB 可靠地检测对数据的修改?