跟踪更新的列postgresql触发器?

跟踪更新的列postgresql触发器?,postgresql,stored-procedures,triggers,postgresql-9.3,Postgresql,Stored Procedures,Triggers,Postgresql 9.3,我正在使用postgreSQL,并且我有一些表,在这些表上我使用触发器来获得表更改的通知 现在,我有一个用例,当表更新完成时,我只想通知表中更新的列。因此,如果我的表有10列,并且只有5列得到更新,那么我只需要通知5个更新的列 一种方法是在每一列上使用新旧内容并进行比较。这将导致每个表都有一个单独的函数 postgreSQL中是否有针对这种情况的功能 您可以在或中创建触发器 这两种方法都会生成关于触发一组变量中函数的表上下文的所有信息,新旧数组都是关联数组,因此您可以自由地做任何您喜欢的事情。例

我正在使用postgreSQL,并且我有一些表,在这些表上我使用触发器来获得表更改的通知

现在,我有一个用例,当表更新完成时,我只想通知表中更新的列。因此,如果我的表有10列,并且只有5列得到更新,那么我只需要通知5个更新的列

一种方法是在每一列上使用新旧内容并进行比较。这将导致每个表都有一个单独的函数


postgreSQL中是否有针对这种情况的功能

您可以在或中创建触发器

这两种方法都会生成关于触发一组变量中函数的表上下文的所有信息,新旧数组都是关联数组,因此您可以自由地做任何您喜欢的事情。例如:

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;

可以在或中创建触发器

这两种方法都会生成关于触发一组变量中函数的表上下文的所有信息,新旧数组都是关联数组,因此您可以自由地做任何您喜欢的事情。例如:

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;

您可以使用
hstore
json
来检测更改。请参见此处或此处@a_horse_,名称为:第一个链接不起作用<代码>jsonb在PostgreSQL 9.4中,我有9.3。9.3中是否有针对用例的解决方案?第一个链接对我来说没有问题。如果您确实想使用json解决方案,那么为什么不升级到9.5?您可以使用
hstore
json
来检测更改。请参见此处或此处@a_horse_,名称为:第一个链接不起作用<代码>jsonb在PostgreSQL 9.4中,我有9.3。9.3中是否有针对用例的解决方案?第一个链接对我来说没有问题。如果您确实想使用json解决方案,那么为什么不升级到9.5呢?