Postgresql - 确定从级联删除中删除的记录

时间:2013-08-26 20:49:20

标签: postgresql relational-database cascade

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

目前存在一个小问题。如果没有详细介绍表格设置,数据建模等等,我相信它可以通过简单的删除查询来修复,因为表格设置为使用级联删除。

但是,从供应商提供的源代码生成此数据库大约需要9个小时,所以我总是对引入新的更改犹豫不决。我目前有一个这个数据库的副本,我打算先运行查询,让用户'CAN'成功运行。但是,sql的一个缺点是,当删除时,输出通常只有以下几行:

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

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

2 个答案:

答案 0 :(得分:1)

  

在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外键关系来自动创建奖励积分,但这可能比其价值更麻烦。

答案 1 :(得分:0)

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