Postgresql:检测哪个外键触发了“on before before”触发器
令T为一个包含两列的表:a和b,分别对表A和B进行引用.这类引用的类型为“delete cascade”,因此如果删除A或B中的行,则T中的行为匹配原始参考也将被删除.
现在,我想在T上设置一个触发器“on before row row”:有没有办法检测哪个引用触发了T中的行删除?换句话说:我可以知道触发器是从A级还是B级联触发的? 谢谢. 编辑 好的,我已经简化了问题.我有以下表格: 用户: > id:整数SERIAL主键 validatorchains: > id:整数SERIAL主键 validatorchainslinks: > chain:删除级联上的整数外键validatorchains.id 在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触发器中的记录.如果在多个表之间发生相同的模式(级联删除),这将是更优雅的解决方案. 级联删除发生在单个事务中,因此您应该受到保护,不受竞争条件的影响. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |