2017-09-27 5 views
0

약 70 개의 테이블이있는 PostgreSQL 데이터베이스가 있으며 각 테이블에 두 개의 열, created_byupdated_by을 추가하려고합니다. 심지어 우리는이 SQL을 허용하지 않는 H2 메모리 데이터베이스를 사용하는 통합 테스트를 위해,수동으로 테이블을 나열하지 않고 H2 데이터베이스의 모든 테이블에 열을 추가합니다.

DO $$ 
DECLARE 
    tables CURSOR FOR 
    SELECT tablename 
    FROM pg_tables 
    WHERE schemaname = 'myschema' 
    ORDER BY tablename; 
BEGIN 
    FOR table_record IN tables LOOP 
    EXECUTE 
     'ALTER TABLE ' || table_record.tablename || ' ADD COLUMN created_by BIGINT; ' || 
     'ALTER TABLE ' || table_record.tablename || ' ADD COLUMN updated_by BIGINT;'; 
    END LOOP; 
END$$; 

그러나 우리가 Liquibase를 사용하고 있기 때문에, 나는 PostgreSQL을에서 잘 작동하는 업데이트 스크립트를 작성했습니다 PostgreSQL 호환 모드.

SELECT * FROM INFORMATION_SCHEMA.TABLES 

을하지만,뿐만 아니라 myschema이 작업을 수행합니다 From this question, 나는 모든 테이블을 선택하는 방법을 알아? 결과를 저장하고 열을 추가하기 위해 루프를 돌리는 방법이 있습니까? 나는 또한 대답에서 언급 한 바와 같이 준비된 문장을 사용하거나 쓰는 방법을 이해하지 못한다.

기본 질문은 : 모든 테이블을 수동으로 나열하지 않고 H2 데이터베이스에 해당하는 업데이트 스크립트를 작성하려면 어떻게합니까?

답변

-1

내가 H2 구문이 할 수있는 방법을 발견하지 않았습니다이 :-)

DECLARE @Schema VARCHAR(20), 
    @Table VARCHAR(50), 
    @Query VARCHAR(4000), 
    @Column VARCHAR(100) = 'Column', 
    @Column_props VARCHAR(1000) = 'INT NOT NULL DEFAULT 0' 
DECLARE c_cursor CURSOR FAST_FORWARD LOCAL FOR 
SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE    
TABLE_TYPE='BASE TABLE' 
OPEN c_cursor 
FETCH NEXT FROM c_cursor INTO @Schema, @Table 
WHILE @@FETCH_STATUS = 0 BEGIN 
    SET @Query = ' 
    IF COL_LENGTH('''[email protected]+'.'[email protected]+''', '''[email protected]+''') IS NULL BEGIN 
     ALTER TABLE '[email protected]+'.'[email protected]+' 
     ADD ['[email protected]+'] '[email protected]_props+' 
    END' 
    EXEC(@Query) 
    FETCH NEXT FROM c_cursor INTO @Schema, @Table 
END 
CLOSE c_cursor 
DEALLOCATE c_cursor 
+0

내가 해달라고 Postgre ..와 puch 경험을 가지고 이것은 MSSQL에 내 솔루션이 될 것입니다 – Morte

+0

사실, H2를 위해 그것을 필요합니다. SQL 문에서 구문 오류가 발생했습니다. "..."예상 됨 또는 FORCE, VIEW, ALIAS, SEQUENCE, USER, TRIGGER, ROLE, SCHEMA, CONSTANT, DOMAIN, TYPE, DATATYPE, AGGREGATE, LINKED, MEMORY, – Cecilya

+0

루프 중에 while 'fetch next'가 누락되었습니다. 지금 편집 중입니다. 그러나 나는 이것이 당신의 문제가 아니라고 생각한다. sry, h2 db 시스템에 대해 많이 모른다. – Morte

0

같은 것을보십시오. 이 모든 테이블에 대한 ALTER TABLE 쿼리의 목록을 반환

SELECT 'ALTER TABLE ' || tablename || ' ADD COLUMN created_by BIGINT; ' || 
     'ALTER TABLE ' || tablename || ' ADD COLUMN updated_by BIGINT;' 
     FROM pg_tables 
     WHERE schemaname = 'myschema' 
     ORDER BY tablename; 

, 예를 들면 : 대신, 내가 PostgreSQL의 구문을 사용하여 해당 쿼리를 생성하는 SQL을 사용

ALTER TABLE first_table ADD COLUMN created_by BIGINT; 
ALTER TABLE first_table ADD COLUMN updated_by BIGINT; 

이 변화하는 세트를 동적으로 작동하지 않습니다 테이블의 고정 된 세트에 대해서만 이것을 실행해야하므로, 제 경우에는 정상적으로 작동합니다.

(나는 내 ​​PostgreSQL 데이터베이스에 연결된 SQL 워크 벤치에서 쿼리를 실행. 결과보기는 생성 된 쿼리를 나열하고 다음 테스트 중에 실행되는 스크립트 파일에 복사 할 수 있습니다.)