2017-09-27 4 views
0

私は約70テーブルのPostgreSQLデータベースを持っており、それぞれに2つのカラム、created_byupdated_byを追加したいと思います。でも、私たちはこのSQLを受け入れていないH2インメモリ・データベースを使用している統合テストのために、テーブルを手動でリストしないで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$$; 

しかし:我々はLiquiBaseをを使っているので、私は、PostgreSQLでは正常に動作更新スクリプトを書かれていますPostgreSQL互換モードで動作します。

SELECT * FROM INFORMATION_SCHEMA.TABLES 

をが、同様にmyschemaのためにこの作業を行います。From this question、私はすべてのテーブルを選択する方法を知っていますか?結果を保存して列に追加する方法がありますか?私はまた、答えに記載されているように、準備されたステートメントの使い方や書き方を理解していません。

基本的な質問は次のとおりです。すべてのテーブルを手動でリストすることなく、H2データベース用の同等の更新スクリプトを作成するにはどうすればよいですか?

答えて

-1

は、私は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、 – Cecilya

+0

whileループで「次をフェッチする」ことができませんでした。その編集が完了しました。しかし、私はこれがあなたの問題ではないと思う。sry、h2 dbシステムについてはあまり知らない – Morte

0

のようなものを試してみてください。これは、すべてのテーブルのALTER TABLEクエリのリストを返します

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; 

、例えば:代わりに、私はPostgreSQLの構文を使用して、適切なクエリを作成するためにSQLを使用

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

これは、変更セットのために、動的に動作しません。私はテーブルの固定されたセットのためにこれを実行する必要があるので、私の場合は正常に動作します。

(私は私のPostgreSQLデータベースに接続し、SQL Workbenchでクエリを実行しました。結果ビューが作成された、彼らはその後、テスト中に実行されるスクリプトファイルにコピーすることができ、クエリを示しています。)

関連する問題