2017-01-26 37 views
2

我用libpqxx用于连接到PostgreSQL的+ DB用C。我想加密一列表并用当前列替换它。我写这个:如何替换PostgreSQL +上表的列值?

int num; 
cout << "Select Your COLUMN Number For Encryption: "; 
cin >> num; 

/* Create SQL statement */    
sql = "SELECT * from " + tbName; 

/* Execute SQL query */ 
result R3(N.exec(sql)); 

/* List down all the records */ 
for (result::const_iterator c = R3.begin(); c != R3.end(); ++c) { 
    c[num].as<string>() = encnum->encryptionData(3,5,c[num].as<int>()); 
    cout << "Encryption = " << c[num].as<string>() << endl; 
} 

但结果就像加密之前。我的错在哪里,以及如何将值替换为列中的其他值?

+0

如果你想更新表列,那么你应该执行[更新](https://www.postgresql.org/docs/9.6/static/dml-update.html)语句。 – karastojko

+0

你能告诉我吗?我尝试更新一个值,但我想更新整个列。 @karastojko – Richard

+0

你试试[简介示例](http://pqxx.org/development/libpqxx/),其中有更新语句? – karastojko

回答

0

所以我对你的问题的理解是你有文本或二进制数据的列,要更新该列中的所有行密文表示文件的当前内容的加密版本。

有两种方法。

  1. 一次选择并更新一行。优点是您可以更轻松地管理事务大小。换句话说,在这种情况下,您一次更新一个值并在客户端执行加密。

  2. 您可以使用类似pg_crypto这样的标准扩展名来加密数据并使用单个更新查询来执行此操作。请注意,这可能需要较长时间的打开写入事务限制了autovacuum可以清理的内容。还需要为查询提供密钥,因此您可以在日志中公开密钥。

这些方法之间存在巨大的折衷。在PostgreSQL中,通常由客户端管理的加密是由于您在后端获得的关键披露和管理问题。但是其他方法存在。