Postgres: удалить все таблицы, принадлежащие определенной роли (или принудительно удалить роль, игнорируя зависимые объекты). - PullRequest
0 голосов
/ 09 марта 2011

В 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; перед удалением, но в зависимости от этой роли все еще существуют объекты, которые препятствуют его удалению.

1 Ответ

4 голосов
/ 09 марта 2011

Вы используете TRUNCATE TABLE - это не удалит таблицу.Для этого вам нужно запустить DROP TABLE.

Я думаю, ваша проблема в том, что роль принадлежит объектам в другой базе данных.Вам нужно запустить свою функцию один раз в каждой базе данных.Или лучше, DROP OWNED BY bob один раз в каждая база данных должна работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...