gpt4 book ai didi

Postgresql:检测哪个外键触发了 "on before delete"触发器

转载 作者:行者123 更新时间:2023-11-29 11:30:04 25 4
gpt4 key购买 nike

T 是一个包含两列的表:ab,分别引用表 AB。这样的引用是“删除级联”类型的,所以如果 AB 中的一行被删除,T 中与原点匹配的行引用也将被删除。

现在,我想在 T 上设置一个触发器“on before delete row”:有什么方法可以检测哪个引用触发了 T 中的行删除?换句话说:我能知道触发器是从 A 还是从 B 级联触发的吗?

谢谢。

编辑

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

用户:

  • id: 整数 SERIAL 主键
  • 姓名:字符变化(128)

验证器链:

  • id: 整数 SERIAL 主键
  • 姓名:字符变化(128)

验证链链接:

  • 链:删除级联上的整数外键validatorchains.id
  • 用户:删除级联时的整数外键users.id
  • 下一步:整数外键 users.id 删除集为空
  • prev: integer foreign key users.id on delete set null

我在 validatorchainslinks 上的“on before delete”触发器的代码是:

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 中的一行触发的,会发生什么情况?我不希望触发器执行更新操作,而是跳过它并让系统删除所有引用相应验证器链的行。

希望这对您有所帮助。

最佳答案

您可以通过一些变通办法来做到这一点。

由于 PG 不会在触发级联 DELETE(在 validatorchainslinks 中)的触发函数中为您提供任何相关信息,因此您应该在某个地方记录此信息,紧接在正在删除的外部记录(在 usersvalidatorchains 中)。因此,您可以编写一个 BEFORE DELETE 触发器,用一个值更新 validatorchainslinks 中的所有记录,然后您可以在后一个表的触发器函数中检查该值。当然,这需要您向表中添加一个字段。

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

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

关于Postgresql:检测哪个外键触发了 "on before delete"触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24447325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com