2017-08-15 33 views
1

我在rhel7上使用postgres 9.2并已开始查看列加密。我对使用INSERT声明获得加密没有任何问题,但是我无法解决如何使用UPDATE语句为已包含行的表执行此操作。在更新语句中加密postgres列

我一直在使用这个网址http://www.postgresonline.com/journal/archives/165-Encrypting-data-with-pgcrypto.html

的例子,我INSERT是从这个URL所采取的格式。

INSERT INTO testuserscards(username, cc) 
SELECT robotccs.username, pgp_pub_encrypt(robotccs.cc, keys.pubkey) As cc 
FROM (VALUES ('robby', '41111111111111111'), 
    ('artoo', '41111111111111112')) As robotccs(username, cc) 
    CROSS JOIN (SELECT dearmor('-----BEGIN PGP PUBLIC KEY BLOCK----- 
super publickey goobly gook goes here 
-----END PGP PUBLIC KEY BLOCK-----') As pubkey) As keys; 

我周围的UPDATE声明工作如何结合在一起的,我已经试过这看起来像以下(从上面的INSERT使用不同的表)的各种组合只是不能让我的头。

update dg_test t1 
set var2 = t2.var2 from (select pgp_pub_encrypt(var1,keys.pubkey) as var2 from dg_test) t2 
where t1.var1 = t2.var1 
    CROSS JOIN (SELECT dearmor('-----BEGIN PGP PUBLIC KEY BLOCK----- 
.... 
-----END PGP PUBLIC KEY BLOCK-----') As pubkey) As keys; 

我想另一个办法是建立一个ON INSERT触发做加密,然后运行DUMPRESTORE

有没有人有一个想法如何做到这一点与UPDATE

回答

1

从你的例子中,下面有什么问题? (唯一的区别是我加入pubkey与原始表中的子项)

update dg_test t1 
set var2 = t2.var2 from (
    select pgp_pub_encrypt(var1,keys.pubkey) as var2 
    from dg_test 
    CROSS JOIN (SELECT dearmor('-----BEGIN...--END PGP PUBLIC KEY BLOCK-----') As pubkey) As keys; 
) t2 
where t1.var1 = t2.var1 
+0

这样做,谢谢,救了我一大块工作 – davegreen100