Fire SQL仅在特定用户更新行时触发

时间:2014-01-07 11:17:41

标签: sql postgresql triggers

postgres中有一个触发器,只要更新特定的表,就会调用它。 它用于将更新发送到另一个API。

有没有办法可以控制触发器的触发? 有时当我更新表时,我不希望触发器被触发。我该怎么做呢? 是否有静音触发sql语法?

如果不是

PG用户X更新行时是否可以触发触发器,PG用户Y更新表时不应触发触发器?

2 个答案:

答案 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来控制所有触发器的触发

  • Directly enable/disable triggers

特别是,如果您的应用程序为所有数据库访问共享一个SQL级别的用户ID,并且在SQL级别之上执行自己的用户管理,并且您希望基于每个用户控制触发器触发,那么唯一的方法是它将采用触发逻辑。您可能会发现以前的答案有关在触发器中获取用户ID的有用信息:

Passing user id to PostgreSQL triggers