我有一个带有jsonb 列的postgres表,目的是插入灵活的文档,然后进行一些搜索
让我们从表格和一些示范数据开始:
create table my_table (id serial primary key, label text, document jsonb);
insert into my_table (label, document) values ('white', '{"name": "john", "lastname": "doe", "eyes": "brown", "birth": "07/08/1979 19:12:55", "pet": "dinosour", "wife": "872", "cat": "no"}');
insert into my_table (label, document) values ('lemon', '{"name": "jane", "lastname": "doe", "birth": "07/08/1978 19:12:55", "cat": "yes"}');
insert into my_table (label, document) values ('white', '{"name": "peter", "eyes": "blue", "birth": "07/08/1980 19:12:55", "pet": "worm", "dog": "yes"}');
insert into my_table (label, document) values ('cyanide', '{"name": "peter", "lastname": "doe", "doormat": "yes"}');
当数据开始流入一些正在创建的索引时(这就是列类型为 jsonb 的原因),例如:
create index on my_table (((document->>'name')::text)) WHERE (document->>'name') is not null and label = 'white';
create index on my_table (((document->>'lastname')::text)) WHERE (document->>'lastname') is not null and label = 'lemon';
create index on my_table (((document->>'doormat')::text)) WHERE (document->>'doormat') is not null and label = 'cyanide';
此时一切都按预期工作,我们能够以良好的性能执行良好的搜索,例如:
select * from my_table
where to_timestamp(document->>'birth', 'DD/MM/YYYY HH24:MI:SS')
between to_timestamp('07/08/1979 00:00:00', 'DD/MM/YYYY HH24:MI:SS')
and to_timestamp('07/08/1979 23:59:59', 'DD/MM/YYYY HH24:MI:SS');
select * from my_table where document->>'cat' = 'yes' or document->>'eyes' = 'brown';
问题是现在我们需要像我通常使用 pgcrypto 那样加密数据库中的信息,但是我找不到一种方法来加密jsonb 类型而不会失去所有索引能力或字段的搜索能力,这将我推回到一个非常原始状态。
我们发现关于带有 jsonb 类型的 pgcrypto 的信息太少了,例如:Postgresql - 加密 jsonb 数据和 pgcrypto 文档没有说明任何关于 jsonb 类型的信息https://www.postgresql.org/docs/10/static/pgcrypto。 html
有没有办法我们可以做类似 pgp_sym_decrypt(jsonb, 'secret') 的事情?或者我们可以加密数据而不会丢失至少字段搜索能力的另一种机制?(我们可以牺牲索引)
提前致谢,