gpt4 book ai didi

postgresql - Postgres : Drop all tables that belong to a specific role (or force dropping a role, 忽略依赖对象)

转载 作者:行者123 更新时间:2023-11-29 14:12:46 25 4
gpt4 key购买 nike

在 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;,但仍然有对象依赖于该角色,阻止删除它。

最佳答案

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

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

关于postgresql - Postgres : Drop all tables that belong to a specific role (or force dropping a role, 忽略依赖对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5243530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com