0
我想知道是否可以根据事务强制在PostgreSql中执行触发器。对整个事务执行Postgres触发器,而不是对每个更新操作执行PostgreSQL触发器
我正在更新python脚本中的记录(从for循环中)。有一个触发器将更新操作中的记录插入表中。现在,我只想插入一个基于整个事务的记录,而不是从python脚本中更新的每条记录。
有没有办法可以做到这一点?
我想知道是否可以根据事务强制在PostgreSql中执行触发器。对整个事务执行Postgres触发器,而不是对每个更新操作执行PostgreSQL触发器
我正在更新python脚本中的记录(从for循环中)。有一个触发器将更新操作中的记录插入表中。现在,我只想插入一个基于整个事务的记录,而不是从python脚本中更新的每条记录。
有没有办法可以做到这一点?
这是一个有点笨拙,但你可以是有条件触发做到这一点:
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;
如果在BEGIN和COMMIT之间有一堆更新语句,我只想为此调用一次触发器。有没有办法来检测这种情况? – akashag26