列在H2数据库中所有表添加,而无需手动清单表
问题描述:
我有70桌的PostgreSQL数据库,我想两列添加到每个人,created_by
和updated_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
答
我还没有找到一种方法与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数据库,结果视图列出创建的查询,然后可以将它们复制到在测试过程中执行的脚本文件)。
我不有Postgre的Puch经验..这将是我的解决方案MSSQL – Morte
我需要它的H2,实际上。执行此操作会给我'SQL语句中的语法错误:“...”期望“OR,FORCE,VIEW,ALIAS,SEQUENCE,USER,TRIGGER,ROLE,SCHEMA,CONSTANT,DOMAIN,TYPE,DATATYPE,AGGREGATE,LINKED,MEMORY,在while循环。其现在编辑' – Cecilya
我失踪 '获取下一个';缓存本地,全局TEMP,临时表,PRIMARY,UNIQUE,HASH,空间,INDEX“。但我认为这不是你的问题。sry,对h2db系统不太了解 – Morte