2016-05-04 15 views
1

私はpostgreSQLを使用しており、テーブルの変更を通知するためにトリガを使用するテーブルがあります。更新された列postgresqlトリガーを追跡しますか?

ここでは、テーブルの更新が行われたときに、テーブルの更新された列のみに通知したい場合があります。だから私のテーブルが10の列を持っていて、5つしか更新されない場合、私は5つの更新された列の通知する必要があります。

1つのアプローチは、すべての列でOLDとNEWを使用して比較することです。これは、各テーブルのための別個の機能につながるだろう。

このような場合、postgreSQLにはどのような機能がありますか?

+0

変更を検出するには、 'hstore'または' json'を使用できます。こちらをご覧くださいhttp://okbob.blogspot.co.uk/2015/01/most-simply-implementation-of-history.htmlまたはこちらhttp://8kb.co.uk/blog/2015/01/19/copying -pavel-stehules-simple-history-table-but-the-jsonb-type/ –

+0

@a_horse_with_no_name:最初のリンクが機能していません。 'jsonb'はPostgreSQL 9.4にあり、私は9.3を持っています。 9.3のユースケースの解決法はありますか? –

+0

最初のリンクは問題なく私のために働く。 jsonソリューションを使用したい場合は、なぜ9.5にアップグレードしないのですか? –

答えて

0

pl/tclまたはpl/perlにトリガーを作成できます。

変数の束の中で関数をトリガーするテーブルのコンテキストに関するすべての情報を生成します。また、OLDとNEWは連想配列なので、自由に自由に操作できます。例:

CREATE OR REPLACE FUNCTION valid_id() RETURNS trigger AS $$ 
    my ($new, $old) = ($_TD->{new}, $_TD->{old}); 
    my (@allflds) = keys %$new; 
    my (@changed) = grep { $new->{$_} ne %$old->{$_} } @allflds; 

    my (%difold, %difnew); 

    %difold = map { _$ => $old->{_$} } @changed; 
    %difnew = map { _$ => $new->{_$} } @changed; 

    ... notify the values in %difold and %difnew as you need ... 
$$ LANGUAGE plperl; 
関連する問題