2015-01-06 4 views
4

PostgreSQL을 사용하는 스키마의 모든 테이블을 잘라내려고합니다. 내가 사용하는 기능 여기PostgreSQL에서 스키마의 모든 테이블을 자름

ERROR: relation "Building" does not exist 
CONTEXT: SQL statement "TRUNCATE TABLE "Building" CASCADE" 
PL/pgSQL function truncate_schema(character varying) line 15 at EXECUTE statement 

됩니다 :

CREATE OR REPLACE FUNCTION truncate_schema(schema IN VARCHAR) RETURNS void AS $$ 
DECLARE 
    statements CURSOR FOR 
     SELECT table_name FROM information_schema.tables 
WHERE table_type = 'BASE TABLE' AND table_schema = schema; 
BEGIN 
    FOR stmt IN statements LOOP 
     EXECUTE 'TRUNCATE TABLE ' || quote_ident(stmt.table_name) || ' CASCADE'; 
    END LOOP; 
END; 
$$ LANGUAGE plpgsql; 

어떻게 적절하게이 작업을 수행하는을은이 오류를 보여주고있다?

답변

6

는 다른 오류 기록 "STMT는"더 필드 "TABLE_SCHEMA"가 없다하고있는 response.It이

CREATE OR REPLACE FUNCTION truncate_schema(_schema character varying) 
    RETURNS void AS 
$BODY$ 
declare 
    selectrow record; 
begin 
for selectrow in 
select 'TRUNCATE TABLE ' || quote_ident(_schema) || '.' ||quote_ident(t.table_name) || ' CASCADE;' as qry 
from (
    SELECT table_name 
    FROM information_schema.tables 
    WHERE table_type = 'BASE TABLE' AND table_schema = _schema 
    )t 
loop 
execute selectrow.qry; 
end loop; 
end; 
$BODY$ 
    LANGUAGE plpgsql 
+1

위대한 작품입니다. 고마워요 – Farook

+0

마지막 줄 끝에 세미콜론이 필요하다고 생각하지 않습니까? – itsji10dra

+1

감사합니다. 매우 도움이됩니다. –

2

TRUNCATE 문에 스키마 이름이 포함되어 있지 않으므로 public 스키마의 테이블을 찾고 있기 때문일 수 있습니다.

는 다음과 같이에 TRUNCATE 문을 변경해보십시오 : 염두에두고

또한
EXECUTE 'TRUNCATE TABLE ' || quote_ident(stmt.table_schema) || '.' || 
    quote_ident(stmt.table_name) || ' CASCADE'; 

, 무언가에 대한 CASCADE입니다 그 것이다 TRUNCATE것과 외래 키 관계가있는 모든 테이블 이 스키마는 스키마 외부의 테이블을 포함 할 수 있습니다. 응답

편집 OP에서 언급합니다 :

당신은 또한이 EXECUTE 문 내에서 사용할 수 있습니다 그래서 statements 뒤에 쿼리에 table_schema를 추가해야합니다.

+0

감사처럼하려고합니다. – Farook

+0

물론, 문제 없습니다. – khampson

관련 문제