Postgresql:检测哪个外键触发了“on before before”触发器

时间:2014-06-27 08:29:16

标签: postgresql

T成为包含两列的表格:ab,分别引用表AB。此类引用属于"删除级联",因此如果删除AB中的行,T中与原点引用匹配的行也将删除。

现在,我想在删除行"之前设置触发器#34; on T:有没有办法检测哪个引用触发了T中的行删除?换句话说:我可以知道触发是否是从AB级联触发的吗?

谢谢。

修改

好的,我已经简化了问题。我有以下表格:

用户

  • id:整数SERIAL主键
  • name:character varying(128)

validatorchains

  • id:整数SERIAL主键
  • name:character varying(128)

validatorchainslinks

  • chain:删除级联上的整数外键validatorchains.id
  • user:delete cascade上的整数外键users.id
  • next:整数外键users.id on delete set null
  • 上一页:整数外键users.id on delete set null

我的"在删除之前的代码" validatorchainslinks上的触发器是:

BEGIN   
   UPDATE validatorchainslinks SET next = OLD.next WHERE next = OLD.user;
   UPDATE validatorchainslinks SET prev = OLD.prev WHERE prev = OLD.user;
   RETURN OLD;
END;

因此,目的是创建一个可以验证某种操作的用户链表。为了验证操作,链中的所有用户必须同意。在删除用户时维护链接列表时出现问题。上面的触发器代码成功地重新链接了链的元素。但是,如果通过删除validatorchains中的行来触发删除会发生什么?我不希望触发器执行UPDATE操作,但跳过它并让系统删除引用相应验证器链的所有行。

希望这有帮助。

1 个答案:

答案 0 :(得分:1)

你可以通过一些解决方法来做到这一点。

由于PG没有在触发函数中提供触发级联DELETE(在validatorchainslinks中)的任何相关信息,因此您应该在外部记录之前的某处(在{中)记录此信息{1}}或users)被删除。因此,您可以编写一个validatorchains触发器来更新BEFORE DELETE中的所有记录,其值可以在后一个表的触发器函数中检查。这需要您在表格中添加一个字段。

或者,您可以创建一个单独的表,列出即将删除的表中的记录,然后任何触发器功能都可以查看该信息。将该表写入validatorchainslinks触发器并删除同一表中BEFORE DELETE触发器中的记录。如果在多个表之间发生相同的模式(级联删除),这将是更优雅的解决方案。

级联删除发生在单个事务中,因此您应该受到保护,不受竞争条件的影响。