在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;
,但仍然存在取决于该角色的对象,这会阻止删除它。
答案 0 :(得分:4)
您正在运行TRUNCATE TABLE - 不会删除该表。您需要为此运行DROP TABLE。
我猜你的问题是因为角色拥有不同数据库中的对象。您需要在每个数据库中运行一次您的函数。或者更好的是,在每个数据库中删除一次所有权的人应该可以工作。