2017-01-26 32 views
2

C++でPostgreSQL DBに接続する場合は、libpqxxを使用します。私はテーブルの列を暗号化し、現在の列に置き換えたいです。私はこれを書く: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

私を見せてもらえますか?私はupdateで1つの値を試しましたが、列全体を更新したいと思います。 @karastojko – Richard

+0

あなたは[簡単な例](http://pqxx.org/development/libpqxx/)に更新ステートメントがありますか? – karastojko

答えて

0

あなたの問題を理解するには、テキストまたはバイナリデータの列があり、その列のすべての行を、ファイルの現在の内容の暗号化されたバージョンを表すcyphertextに更新する必要があります。

2つのアプローチがあります。

  1. 一度に1行を選択して更新します。利点は、トランザクションサイズをより簡単に管理できることです。つまり、この場合、一度に1つの値を更新し、クライアントで暗号化を実行します。

  2. データを暗号化して単一の更新クエリを使用する標準的な拡張子であるpg_cryptoなどを使用できます。これにより、より長いオープン書込みトランザクションで、自動バキュームがクリーンアップできるものが制限されることに注意してください。また、クエリにキーを提供する必要があるため、ログにキーを公開する可能性があります。

アプローチ間には大きなトレードオフがあります。 PostgreSQLでは、通常はクライアント管理の暗号化が行われます。なぜなら、バックエンドでの重要な開示や管理の問題があるからです。しかし、他のアプローチが存在する。

関連する問題