2016-05-04 61 views
1

我正在使用postgreSQL,并且我有使用触发器来获取表上更改通知的表。跟踪更新的列postgresql触发器?

现在,我有一个用法,当表上的更新完成后,我只想通知我表中的更新列。所以,如果我的表有10列,只有5个更新,我只需要通知5个更新的列。

一种方法是在每一列上使用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-the-jsonb-type/ –

+0

@a_horse_with_no_name:第一个链接不起作用。 'jsonb'在PostgreSQL 9.4中,我有9.3。对于用例,9.3有解决方案吗? –

+0

第一个链接对我毫无问题。如果你确实想使用json解决方案,那么为什么不升级到9.5? –

回答

0

您可以在pl/tclpl/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;