消防SQL触发器只在特定用户更新行(Fire SQL Trigger only when a par

2019-10-19 04:45发布

有Postgres里的触发器,当特定表被更新时调用。 它是用来更新发送到另一个API。

有没有一种方法可以控制这个触发的触发? 有时,当我更新表,我不想触发被解雇。 我该怎么做呢? 是否有一个沉默触发SQL语法?

如果不

我可以引发触发器,当行由PG用户X更新,当PG用户Y更新表没有触发器应该被开除?

Answer 1:

在最近的Postgres版本中,有一个when ,你可以用它来有条件地触发触发器条款。 你可以使用它像:

... when (old.* is distinct from new.*) ...

我不是100%,这其中就可以了(不能测试ATM):

... when (current_user = 'foo') ...

(如果没有,请尝试将它放在您的PLPGSQL如果块)。

http://www.postgresql.org/docs/current/static/sql-createtrigger.html

(还有就是[before|after] update of [col_name]语法,但我倾向于认为它用处不大,因为它会触发即使列的值保持不变。)


添加此额外的笔记,看到@ CraigRinger的回答凸显你在做什么?

试图与Salesforce和Postgres的使用条件触发器设置主 - 主复制,我认为,一个白日梦。 只是忘了......还有的将是一个很多比这更多了:你需要锁定两端适当数据为(这不一定会以合理的方式是可行的),管理产生的死锁(这可能无法自动获得被检测),并处理冲突的数据。

你的一个小小的团队成功地拉动这一关赔率约为约零 - 特别是如果你的Postgres的技能是在哪里阅读本手册会回答自己的问题投入时间的水平。 您可以放心地打赌,有人在Salesforce的更称职或一些重要的SQL商店(例如像一个克雷格工程)认为是相同的,并且或者悲惨地失败或排除它。

此外,我会强调实现高效,同步的,多主复制不是解决问题。 你看的没错: 没有解决。 就在几年前,这样做根本没有得到很好的解决了足以令它在Postgres的核心。 所以,你已经没有现有技术能很好地基础工作并迭代后。



Answer 2:

这似乎是同样的问题,因为这个帖子几分钟前 ,从不同的方向接近它。

如果是这样,而你的确可以做到丹尼斯暗示, 不要试图彻底改造这个轮子 。 如果您正试图双向(多主)复制使用诸如Slony聚-I或Bucardo这是一个既定的工具。 您还需要了解与冲突更新打交道时,参与多主的主要限制。

在一般情况下,有控制触发器触发的几种方法:

  • 让触发火,然后把逻辑在PL / pgSQL触发器身体原因如果满足特定条件就不会采取任何行动。 这通常是当规则是非常复杂的唯一选择。

  • 丹尼斯指出,使用触发器WHEN子句条件触发触发器

  • 使用session_replication_role控制所有触发器的触发

  • 直接启用/禁用触发器 。

特别是,如果您的应用程序共享一个SQL级别的用户ID来进行数据库访问并执行SQL水平高于其自己的用户管理,并要控制触发器触发对每个用户的基础上,只有这样,才能做到这一点会与在触发逻辑。 您可能会发现有关获取用户ID内触发有用在此之前的答案:

通过用户ID到PostgreSQL触发器



文章来源: Fire SQL Trigger only when a particular user update the row