В 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)
Где ошибка в моей функции? Или есть другие способы принудительно отбросить роль, игнорируя зависимые объекты?
EDIT:
Я также пытался вставить DROP OWNED BY bob;
перед удалением, но в зависимости от этой роли все еще существуют объекты, которые препятствуют его удалению.