将列添加到H2数据库中的所有表,而无需手动列出表

时间:2017-09-27 11:17:43

标签: sql h2

我有一个包含大约70个表的PostgreSQL数据库,我想为每个表添加两列,created_byupdated_by。由于我们正在使用Liquibase,我编写了一个在PostgreSQL中运行良好的更新脚本:

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内存数据库,即使在PostgreSQL兼容模式下也不接受此SQL。 From this question,我知道如何选择所有表格:

SELECT * FROM INFORMATION_SCHEMA.TABLES

但这对myschema也适用吗?有没有办法存储结果并循环它们以添加列?我也不了解如何使用或编写准备好的陈述,如答案中所述。

基本问题是:如何为H2数据库编写等效的更新脚本而无需手动列出所有表?

2 个答案:

答案 0 :(得分: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数据库。结果视图列出了创建的查询,然后可以将它们复制到测试期间执行的脚本文件中。)

答案 1 :(得分:-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('''+@Schema+'.'+@Table+''', '''+@Column+''') IS NULL  BEGIN
      ALTER TABLE '+@Schema+'.'+@Table+'
      ADD ['+@Column+'] '+@Column_props+'
    END'
    EXEC(@Query)
    FETCH NEXT FROM c_cursor INTO @Schema, @Table
END
CLOSE c_cursor
DEALLOCATE c_cursor