postgres中有一个触发器,只要更新特定的表,就会调用它。 它用于将更新发送到另一个API。
有没有办法可以控制触发器的触发? 有时当我更新表时,我不希望触发器被触发。我该怎么做呢? 是否有静音触发sql语法?
如果不是
PG用户X更新行时是否可以触发触发器,PG用户Y更新表时不应触发触发器?
答案 0 :(得分:4)
在最近的Postgres版本中,有一个when
子句可用于有条件地触发触发器。您可以使用它:
... when (old.* is distinct from new.*) ...
我不是100%这个人会工作(不能测试atm):
... when (current_user = 'foo') ...
(如果没有,请尝试将其放在plpgsql中的if块中。)
http://www.postgresql.org/docs/current/static/sql-createtrigger.html
(还有[before|after] update of [col_name]
语法,但我倾向于发现它不太有用,因为即使列的值保持不变,它也会触发。)
添加这个额外的注释,看到@ CraigRinger的答案突出了你的目标......
我认为,尝试使用条件触发器在Salesforce和Postgres之间设置主 - 主复制是一个梦想。只是忘了它......它会有更多的东西:你需要在两端适当地锁定数据(这在合理的方式下不一定是可行的),管理产生的死锁(可能不会自动检测到),并处理有冲突的数据。
成功通过一个小团队解决这个问题的几率几乎为零 - 特别是如果你的Postgres技能处于阅读手册的投入时间会回答你自己的问题的水平。你可以肯定地说,在Salesforce或某个主要的SQL商店(例如像Craig工作的那个人)更有能力的人认为是相同的,并且要么失败了,要么排除它。
此外,我强调实施高效,同步,多主复制不已解决的问题。你读得对: 不 解决了。就在几年前,在所有中完成它并没有得到很好的解决,足以使其成为Postgres的核心。因此,您没有任何先前的技术能够很好地基于您的工作并进行迭代。
答案 1 :(得分:3)
这似乎与this post a few minutes ago的问题相同,从不同的方向接近它。
如果是这样,虽然你确实可以像丹尼斯所说的那样做,不要试图重新发明这个轮子。如果您尝试双向(多主)复制,请使用Slony-I或Bucardo等已建立的工具。在处理冲突更新时,您还需要了解多主机所涉及的主要限制。
通常,有几种方法可以控制触发器触发:
让触发器触发,然后将逻辑放入PL / PgSQL触发器主体,以使其在满足某个条件时不采取任何操作。当规则很复杂时,这通常是唯一的选择。
正如Denis指出的那样,使用触发器WHEN
子句有条件地触发触发器
使用session_replication_role
来控制所有触发器的触发
特别是,如果您的应用程序为所有数据库访问共享一个SQL级别的用户ID,并且在SQL级别之上执行自己的用户管理,并且您希望基于每个用户控制触发器触发,那么唯一的方法是它将采用触发逻辑。您可能会发现以前的答案有关在触发器中获取用户ID的有用信息: