【问题标题】:Update trigger on postgresqlpostgresql 上的更新触发器
【发布时间】:2015-06-23 22:30:02
【问题描述】:

我是 PostgreSQL 新手,我正在尝试创建更新触发器。我有两个表源和目标表具有相同的表结构。所以我希望在源有更新时在目的地更新记录。我尝试了以下触发功能:

  Create FUNCTION ins_functiontest() RETURNS trigger AS '
BEGIN
 IF tg_op = ''UPDATE'' THEN
     INSERT INTO  destination(id,name,tg_op)
     VALUES (new.id,new.name, tg_op);
      RETURN new;
  END IF;
END
' LANGUAGE plpgsql;

列 'id' 是两个表上的主键,因此当源上有更新时,上述函数会失败,因为目标上已经存在该记录。

我尝试修改函数以更新表中比较源和目标上的 id 字段的其余列。

 Update des
      Set name = new.name,tg_op= update
      From destination des join source src
      ON des.id = src.id
      Where des.id = src.id

但无法正确获取语法。非常感激任何的帮助。

我使用的是 PostgreSQL 8.4。

【问题讨论】:

  • 您需要发出特定的CREATE TRIGGER 语句才能将该函数视为触发函数。

标签: postgresql triggers


【解决方案1】:

我找到了解决问题的方法,下面是答案。 创建 FUNCTION ins_functiontest() RETURNS trigger AS ' 开始 如果 tg_op = ''更新'' 那么 更新destination_table_name 放 名称 = 新名称, 其中 id = new.id;

结束如果; 结尾 '语言plpgsql;

【讨论】:

    【解决方案2】:

    我为我的日志表做了类似的事情。但我复制了这些列。 1 组用于新的。* 以捕获插入和更新,一组用于旧的。* 也用于更新和删除。然后插入一个串行主键、时间和 idtransaction、txid_current()。唯一的防弹是连续剧。 idtransaction 取决于服务器的工作方式。如果您更改 pc,并且它可能发生在 db 的生命周期中,它将重新启动计数器。但是不可能发生具有相同 id 的两个事务具有相同的时间。但是可以同时发生两个事务。特别是如果您有多个用户。已连接

    【讨论】:

    • 感谢 jurhas 的回复。不幸的是,在我的场景中,我无法复制这些列。我想出了解决我的问题的方法。在这里发布解决方案以防有人需要它。 Create FUNCTION ins_functiontest() RETURNS trigger AS ' BEGIN IF tg_op = ''UPDATE'' THEN Update stg_auth_group SET name = new.name, where id = new.id;万一;结束'语言plpgsql;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多