加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-13 16:07:56 所属栏目:百科 来源:网络整理
导读:令T为一个包含两列的表:a和b,分别对表A和B进行引用.这类引用的类型为“delete cascade”,因此如果删除A或B中的行,则T中的行为匹配原始参考也将被删除. 现在,我想在T上设置一个触发器“on before row row”:有没有办法检测哪个引用触发了T中的行删除?换句
令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触发器中的记录.如果在多个表之间发生相同的模式(级联删除),这将是更优雅的解决方案.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读