2

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

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

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

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

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

4

2 回答 2

5

postgres 中是否有办法确定在使用级联删除时从哪些表中删除了哪些行?

不幸的是,没有简单的内置方式,但这是一个好主意。由于级联删除是通过触发器在后台实现的,因此您所要做的就是修改参照完整性触发器,以便级联删除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外键关系来自动创建它,但这可能比它的价值更麻烦。

于 2013-08-27T01:14:16.560 回答
0

另外的选择。pg_dump在查询之前和之后,然后比较 SQL 文件。

于 2021-01-26T12:58:58.890 回答