PL / PgSQL触发器仅返回更新的字段

时间:2014-01-06 11:57:11

标签: ruby database postgresql

我正在使用ruby和pg gem连接到我的PG数据库。我很震惊。我只需要从触发器函数返回更新的值。

require 'pg'

TRIGGER_FUNCTION = %{
CREATE OR REPLACE FUNCTION notify_account()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
    BEGIN
      NOTIFY accounts_trigger;
      IF (TG_OP = 'UPDATE') THEN
        // Here is where I need to return, the changed fields alone
      ELSE
        RETURN NEW;
      END IF;
    END
$$
}

DROP_TRIGGER = %{
DROP TRIGGER IF EXISTS accounts_notify_trigger ON accounts
}


TRIGGER = %{
CREATE TRIGGER accounts_notify_trigger
AFTER UPDATE OR INSERT OR DELETE
ON accounts
FOR EACH STATEMENT
EXECUTE PROCEDURE notify_account();
}

1 个答案:

答案 0 :(得分:1)

我不明白你的意思是“返回”只是改变的字段。这就是NEW元组的作用 - 你不能省略未更改的字段,因为那时你将返回一个与表行不兼容的元组,触发器会失败

所以我猜你的意思是你只想记录更改的项目。

SQL在将元组作为键/值集进行比较时表现不佳。在这种情况下我倾向于做的是通过hstore将每个元组转换为键/值集,然后使用set操作仅提取不同的对。

方便地,hstore提供了一个能够满足我们需求的运算符,因此我们甚至不必将hstore转换为SQL键/值列表并使用SQL集合操作。

尝试类似:

RAISE NOTICE 'Changed fields: %', (hstore(NEW) - hstore(OLD));

如果您还没有超级用户,则需要CREATE EXTENSION hstore;

如果您正在尝试编写审核触发器,则可能需要查看http://wiki.postgresql.org/wiki/Audit_trigger_91plus