Postgres:删除属于特定角色的所有表(或强制删除角色,忽略依赖对象)

Posted

技术标签:

【中文标题】Postgres:删除属于特定角色的所有表(或强制删除角色,忽略依赖对象)【英文标题】:Postgres: Drop all tables that belong to a specific role (or force dropping a role, ignoring dependent objects) 【发布时间】:2011-07-11 17:46:51 【问题描述】:

在 Bash 脚本中,我想删除 Postgres 用户角色。但是 Postgres 不允许我这样做,我得到了 Cannot drop table X because other objects depend on it

所以我想删除依赖于该角色的所有表,以便能够删除该角色。因此,我编写了一个 Postgres 函数(我的第一个函数,受一些帖子的启发),它应该删除属于特定角色的所有表。

这是包含该函数的 Bash 脚本,并尝试将该函数应用于角色 bob

#!/bin/bash

sudo su - postgres -c "psql -d postgres -U postgres" << 'EOF'
CREATE LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION truncate_tables(username IN VARCHAR) RETURNS void AS $$
DECLARE
    statements CURSOR FOR
        SELECT tablename FROM pg_tables
        WHERE tableowner = username;
BEGIN
    FOR stmt IN statements LOOP
        EXECUTE 'TRUNCATE TABLE ' || quote_ident(stmt.tablename) || ';';
    END LOOP;
END;
$$
LANGUAGE plpgsql;
EOF

sudo su - postgres -c "psql -d postgres -U postgres -c \"SELECT truncate_tables('bob');\""

我没有收到任何错误,但脚本没有效果 - 属于该角色的表不会被删除。这是输出:

CREATE FUNCTION
 truncate_tables 
-----------------

(1 row)

我的函数中的错误在哪里?还是有其他方法可以强制删除角色,忽略依赖对象?

编辑:

我还尝试在删除之前插入DROP OWNED BY bob;,但仍有一些对象取决于该角色,阻止删除它。

【问题讨论】:

【参考方案1】:

您正在运行 TRUNCATE TABLE - 这不会删除该表。您需要为此运行 DROP TABLE。

我猜你的问题是因为角色拥有不同数据库中的对象。您需要在每个数据库中运行一次函数。或者更好的是,在 每个 数据库中 DROP OWNED BY bob 一次应该可以工作。

【讨论】:

以上是关于Postgres:删除属于特定角色的所有表(或强制删除角色,忽略依赖对象)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 postgres 中删除特定模式中的每个表?

授予对 Postgres 中所有表的访问权限

有没有办法在 postgres 测试容器中删除所有表或截断

sql 存储过程,删除Postgres中所有表中的所有条目而不删除或截断,并使用可选的忽略。

如何在 Postgres 中删除表的所有索引?

特定表上的 Postgres 复制。