让T
成为包含两列的表格:a
和b
,分别引用表A
和B
。此类引用属于"删除级联",因此如果删除A
或B
中的行,T
中与原点引用匹配的行也将删除。
现在,我想在删除行"之前设置触发器#34; on T
:有没有办法检测哪个引用触发了T
中的行删除?换句话说:我可以知道触发是否是从A
或B
级联触发的吗?
谢谢。
修改
好的,我已经简化了问题。我有以下表格:
用户:
validatorchains :
validatorchainslinks :
我的"在删除之前的代码" validatorchainslinks
上的触发器是:
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
中的行来触发删除会发生什么?我不希望触发器执行UPDATE操作,但跳过它并让系统删除引用相应验证器链的所有行。
希望这有帮助。
答案 0 :(得分:1)
你可以通过一些解决方法来做到这一点。
由于PG没有在触发函数中提供触发级联DELETE
(在validatorchainslinks
中)的任何相关信息,因此您应该在外部记录之前的某处(在{中)记录此信息{1}}或users
)被删除。因此,您可以编写一个validatorchains
触发器来更新BEFORE DELETE
中的所有记录,其值可以在后一个表的触发器函数中检查。这需要您在表格中添加一个字段。
或者,您可以创建一个单独的表,列出即将删除的表中的记录,然后任何触发器功能都可以查看该信息。将该表写入validatorchainslinks
触发器并删除同一表中BEFORE DELETE
触发器中的记录。如果在多个表之间发生相同的模式(级联删除),这将是更优雅的解决方案。
级联删除发生在单个事务中,因此您应该受到保护,不受竞争条件的影响。