2017-09-27 513 views
0

我有70桌的PostgreSQL數據庫,我想兩列添加到每個人,created_byupdated_by。由於我們使用Liquibase,我寫了一個更新腳本在PostgreSQL的正常工作:列在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$$; 

然而,對於集成測試,我們使用的是H2的內存數據庫,它不接受這個SQL,甚至在PostgreSQL兼容模式下。 From this question,我知道如何選擇的所有表:

SELECT * FROM INFORMATION_SCHEMA.TABLES 

但確實這項工作myschema呢?有沒有一種方法來存儲結果並循環播放以添加列?正如答案中所提到的,我也不懂如何使用或編寫準備好的語句。

的基本問題是:我怎麼能寫的H2數據庫等效更新腳本,而不必手動列出所有表?

回答

-1

嘗試這樣:-)

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語句中的語法錯誤:「...」期望「OR,FORCE,VIEW,ALIAS,SEQUENCE,USER,TRIGGER,ROLE,SCHEMA,CONSTANT,DOMAIN,TYPE,DATATYPE,AGGREGATE,LINKED,MEMORY,在while循環。其現在編輯' – Cecilya

+0

我失蹤 '獲取下一個';緩存本地,全局TEMP,臨時表,PRIMARY,UNIQUE,HASH,空間,INDEX「。但我認爲這不是你的問題。sry,對h2db系統不太瞭解 – Morte

0

我還沒有找到一種方法與H2的語法來做到這一點的東西。相反,我用SQL創建使用PostgreSQL語法適當的查詢:

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; 

這返回的ALTER TABLE查詢一個列表中的所有表,例如:

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

這並不動態一組改變工作的表格,但我只需要對一組固定的表格執行此操作,所以對我的情況來說它工作正常。

(我執行在SQL Workbench中的查詢,連接到我的PostgreSQL數據庫,結果視圖列出創建的查詢,然後可以將它們複製到在測試過程中執行的腳本文件)。

相關問題