现在,我想在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] 举报,一经查实,本站将立刻删除。