2017-06-14 14 views
-1

PostgresSQLに挿入、削除、または更新コマンドがあるときに、データベースから通知を受ける最良の方法を見つけようとしています。PostgresSQLの挿入、削除、または更新コマンドで信号を作成し、C++で処理する方法は?

私の目標は、できるだけ早く、彼らが起こるように、データベースの変更を処理することです。

どうすればいいですか?

+0

[このスレッド](https://stackoverflow.com/questions/38457309からアドバイス/ how-to-use-libpqxx-to-receive-notification-from-the-postgresql-database)はあなたにいくつかの手がかりを与えるかもしれません。 また、非同期通知について[PostgreSQL](https://www.postgresql.org/docs/9.1/static/libpq-notify.html)をチェックすることもできますが、APIとサンプルはC言語で記述されています。 –

答えて

4

私はQtでこれを行う良い方法を見つけました。

まず、あなたは更新が起こったことを通知するためのルールを作成する必要があります。

CREATE RULE table_notification_insert AS ON INSERT TO public.table DO NOTIFY table_inserted; 
CREATE RULE table_notification_update AS ON UPDATE TO public.table DO NOTIFY table_updated; 
CREATE RULE table_notification_delete AS ON DELETE TO public.table DO NOTIFY table_deleted; 

その後、あなたはそれぞれの通知を受け取るためにはQtを使用することができます(「table_inserted」、「table_updated」、「table_deleted」)など次の:私は答えの一部を発見したのはここ

QSqlDatabase::database().driver()->subscribeToNotification("table_inserted"); 
QObject::connect(QSqlDatabase::database().driver(), SIGNAL(notification(const QString&)), /*handlerObjectPointer*/, SLOT(handleNotificationFunction(const QString&))); 

は次のとおりです。 forum.qt.io

+1

個人的に私はむしろルールよりもトリガーを使いたいと思っていて、それはうまく動作しますが、クールです。 –

+0

どのようにトリガーを使用しますか? – Fernando

+0

@Fernando:私は@Craigはちょうど彼がむしろ[トリガ機能]で 'NOTIFY'文を入れたいという意味だと思う(https://www.postgresql.org/docs/current/static/plpgsql-trigger.html# PLPGSQL-TRIGGER-AUDIT-EXAMPLE)をルールよりも優先します。ルールシステムには奇妙なエッジケースがいくつかあります([VOLATILE関数は再実行可能](https://www.postgresql.org/docs/current/static/rules-update.html#RULES-UPDATE)。 [NOTIFY]ルールは何も変更されていなくても起動されます](https://www.postgresql.org/docs/current/static/sql-createrule.html#AEN81660))。最高のアドバイスは、通常、ルールを完全に避けることです。 –

関連する問題