gpt4 book ai didi

Postgresql - 确定从级联删除中删除了哪些记录

转载 作者:行者123 更新时间:2023-12-05 02:23:57 28 4
gpt4 key购买 nike

我继承了一个相当大的 postgreql 数据库。我们有一项工作大约每月运行一次,备份现有数据库并使用我们收到的更新供应商数据创建一个新数据库。

目前它有一个小问题。无需深入了解表设置、数据建模等细节,我相信它可以通过简单的删除查询来解决,因为表设置为使用级联删除。

但是,从供应商提供的源生成此数据库大约需要 9 个小时,因此我总是犹豫是否要引入新的更改。我目前有这个数据库的副本,我打算先在上面运行查询,让用户“可以”成功运行。然而,一般来说,sql 的缺点之一是,当进行删除时,输出通常只有以下几行:

查询成功返回:x 行受影响,执行时间 y 毫秒。

在使用级联删除时,postgres 中是否有一种方法可以确定从哪些表中删除了哪些行?我想在我的副本上运行查询,看看被删除的内容是否符合我的预期,至少在哪些表中被删除。这可能吗?

最佳答案

Is there a way in postgres to determine what rows were removed from which tables when using cascading deletes?

不幸的是没有简单的内置方法,但这是个好主意。由于级联删除是由触发器在幕后实现的,您所要做的就是修改引用完整性触发器,以便级联删除在删除行信息之前引发 LOG 级别的消息。这将需要更改 PostgreSQL 源代码并重新编译。

或者,您可以通过在级联约束引用的每个表上创建新的 AFTER DELETE ... FOR EACH ROW 触发器来记录所有 删除。它可以很简单:

CREATE OR REPLACE FUNCTION log_delete() RETURNS trigger AS $$
BEGIN
RAISE LOG 'Deleting row % (statement is %)', OLD, current_query();
RETURN NULL;
END;
$$ LANGUAGE plpgsql;

这样您就不需要修改数据库,尽管您确实需要在每个要进行级联删除的表上安装触发器。

对于奖励积分,您甚至可以通过查询外键关系的 information_schema 来自动创建它,但这可能比它的值(value)更麻烦。

关于Postgresql - 确定从级联删除中删除了哪些记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18452778/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com