2016-06-30 51 views
0

我想知道是否可以根据事务强制在PostgreSql中执行触发器。对整个事务执行Postgres触发器,而不是对每个更新操作执行PostgreSQL触发器

我正在更新python脚本中的记录(从for循环中)。有一个触发器将更新操作中的记录插入表中。现在,我只想插入一个基于整个事务的记录,而不是从python脚本中更新的每条记录。

有没有办法可以做到这一点?

+0

如果在BEGIN和COMMIT之间有一堆更新语句,我只想为此调用一次触发器。有没有办法来检测这种情况? – akashag26

回答

0

这是一个有点笨拙,但你可以是有条件触发做到这一点:

CREATE TRIGGER t 
AFTER UPDATE ON MyTable 
FOR EACH ROW 
WHEN (IsFirstCallForThisTransaction()) 
EXECUTE PROCEDURE MyTrigger(); 

棘手位被定义IsFirstCallForThisTransaction()。在内部,它需要在某个地方设置一个标志,但我们也需要保证这个标志的作用范围是当前事务。

一个选项是使用SET LOCAL来指定custom configuration variable

my_vars.trigger_called_in_current_transaction = false 

或者,附加一个默认的数据库问题:

ALTER DATABASE MyDB SET my_vars.trigger_called_in_current_transaction = false; 

然后函数会是这个样子:您可以通过将这一行服务器的postgresql.conf文件初始化这个变量

CREATE FUNCTION IsFirstCallForThisTransaction() RETURNS BOOLEAN AS 
$BODY$ 
BEGIN 
    IF current_setting('my_vars.trigger_called_in_current_transaction')::boolean THEN 
    RETURN false; 
    ELSE 
    SET LOCAL my_vars.trigger_called_in_current_transaction TO true; 
    RETURN true; 
    END IF; 
END 
$BODY$ 
LANGUAGE plpgsql VOLATILE;