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

时间:2011-03-09 09:14:35

标签: postgresql

在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 个答案:

答案 0 :(得分:4)

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

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