2011-03-09 2 views
0

Bash 스크립트에서 Postgres 사용자 역할을 삭제하려고합니다. 그러나 Postgres는 나를 그렇게시키지 않습니다, 나는 Cannot drop table X because other objects depend on it을 얻고 있습니다.Postgres : 특정 역할에 속한 모든 테이블을 삭제합니다 (또는 종속 개체를 무시하고 강제로 역할을 삭제합니다).

그래서 역할을 제거 할 수 있도록 해당 역할에 의존하는 모든 테이블을 삭제하려고합니다. 따라서 나는 특정 역할에 속하는 모든 테이블을 제거해야하는 Postgres 함수 (첫 번째 게시물, 일부 게시물에서 영감을 얻은)를 작성했습니다.

는 함수를 포함하는 배쉬 스크립트 및 역할 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;를 삽입하려고했으나 아직도의 삭제를 방지하는 역할에 따라 개체가 있습니다.

답변

4

TRUNCATE TABLE을 실행 중이므로 테이블을 제거하지 않습니다. 이를 위해 DROP TABLE을 실행해야합니다.

역할이 다른 데이터베이스의 개체를 소유하고 있기 때문에 귀하의 문제라고 생각합니다. 각 데이터베이스에서 함수를 한 번 실행해야합니다. 또는 더 나은, 멍청이에 의해 한 번 데이터베이스가 작동해야합니다.

관련 문제