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:删除属于特定角色的所有表(或强制删除角色,忽略依赖对象)的主要内容,如果未能解决你的问题,请参考以下文章