仅当特定用户更新行时才触发 SQL 触发器

cod*_*and 1 sql postgresql triggers

postgres 中有一个触发器,每当更新特定表时就会调用该触发器。它用于将更新发送到另一个 API。

有没有一种方法可以控制这个触发器的触发?有时,当我更新表时,我不希望触发触发器。我该怎么做呢?有沉默触发sql语法吗?

如果不

当 PG 用户 X 更新行并且 PG 用户 Y 更新表时,不应触发触发器,我可以触发触发器吗?

Den*_*rdy 5

在最新的 Postgres 版本中,有一个when子句可用于有条件地触发触发器。你可以这样使用它:

... when (old.* is distinct from new.*) ...
Run Code Online (Sandbox Code Playgroud)

我不是 100% 这个能用(无法测试 atm):

... when (current_user = 'foo') ...
Run Code Online (Sandbox Code Playgroud)

(如果没有,请尝试将其放入 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 核心。因此,您没有任何现有技术可以很好地作为您的工作的基础和迭代。

  • @codeAnand 它标识运行导致触发器触发的命令的用户的用户名。这通常是连接到数据库的用户的登录名,但如果您正在运行(例如)“SECURITY DEFINER”过程,它可能会更改。如果您的应用程序对所有用户使用单一 SQL 级别登录,则“current_user”对您来说毫无用处。 (3认同)