列在H2数据库中所有表添加,而无需手动清单表

问题描述:

我有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数据库等效更新脚本,而不必手动列出所有表?

尝试这样:-)

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

我还没有找到一种方法与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数据库,结果视图列出创建的查询,然后可以将它们复制到在测试过程中执行的脚本文件)。