我正在使用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();
}
答案 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。