我有一个包含大约70个表的PostgreSQL数据库,我想为每个表添加两列,created_by
和updated_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数据库编写等效的更新脚本而无需手动列出所有表?
答案 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