微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

令T为一个包含两列的表:a和b,分别对表A和B进行引用.这类引用的类型为“delete cascade”,因此如果删除A或B中的行,则T中的行为匹配原始参考也将被删除.

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

谢谢.

编辑

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

用户

> id:整数SERIAL主键
>名称:变化的字符(128)

validatorchains:

> id:整数SERIAL主键
>名称:变化的字符(128)

validatorchainslinks:

> chain:删除级联上的整数外键validatorchains.id
> user:删除级联上的整数外键用户.id
> next:整数外键users.id on delete set null
> prev:整数外键users.id on delete set null

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

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

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

希望这可以帮助.

解决方法

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

由于PG不会在触发函数中提供任何相关信息,而这些信息会在级联DELETE(在validatorchainslinks中)触发,因此您应该在删除外部记录(在usersor验证器链中)之前的某处记录此信息.因此,您可以编写一个BEFORE DELETE触发器,用于更新validatorchainslinks中的所有记录,然后可以检查后一个表的触发器函数.这需要您在表格中添加一个字段.

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐