用postgres jsonb类型和pgcrypto重击

时间:2018-05-12 20:14:56

标签: postgresql jsonb pgcrypto

我有 postgres 表,其中包含 jsonb列,目的是插入灵活的文档然后进行一些搜索

让我们从表格和一些示范性数据开始:

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类型的方法在不失去所有索引能力或字段的搜索能力的情况下,将我推回到一个非常原始的状态。

我们发现有关pgcrypto和jsonb类型的信息太少,例如:Postgresql - encrypt jsonb data而pgcrypto文档没有提及有关jsonb类型的任何信息https://www.postgresql.org/docs/10/static/pgcrypto.html

有没有办法可以做像pgp_sym_decrypt(jsonb,'secret')这样的事情?或者我们可以加密数据而不至少失去现场搜索能力的另一种机制? (我们可以牺牲索引)

提前致谢,

0 个答案:

没有答案