2016-10-19 18 views
0

私はpopulate.sqlという名前のスクリプトを作成テーブルを含んでいます。異なるスキーマで同じスクリプトを実行する - ポストグル

CREATE TABLE "EXAMPLE" (
................. 
.............. 
); 
CREATE TABLE "BlaBla" (
.......... 
........ 
); 
CREATE TABLE ... 

このスクリプトは、20を超えるテーブルを作成します。私は別のスキーマの上にこのpopulate.sqlを実行したい。このスクリプトをschema1schema2schema3に実行したいとしましょう。

次に書くことができます。 populate.sql

CREATE SCHEMA IF NOT EXISTS "schema1"; 
SET SCHEMA 'schema1'; 

とスキーマにそれらのテーブルを作成します。

psqlコマンド内のすべてのスキーマでこれらのテーブルを作成するにはどうすればよいですか?

psqlでFOR LOOPを実行し、まずスキーマを作成してそのスキームの上にテーブルを作成する必要があると感じる限り、

答えて

1

テーブルは、現在設定されているsearch_pathで作成されます(特に作成ステートメントで特に設定されていない場合)。

ループを使用できます。そのループでは、あなたのスキーマにsearchpathを設定する必要があります。

DO 
$$ 
    DECLARE schemaname text; 
BEGIN 
    FOR i IN 1..3 LOOP 

    schemaname := 'schema' || i::text; 

    execute 'CREATE SCHEMA ' || schemaname; 
    execute 'SET SCHEMA ' || schemaname;  
    execute 'SET search_path TO ' || schemaname; 

    -- conent of populate.sql 

    END LOOP; 
END 
$$; 

コメントでa_horse_with_no_nameで述べたように、このdo block内の外部スクリプトを呼び出すことはできません。したがって、この回答は、populate.sqlファイルを拡張して、その周りにdo blockをラップする場合にのみ関係します。

+0

しかし、doブロックの中のSQLスクリプトを含めることはできません。 –

+0

@a_horse_with_no_nameありがとう、私の答えを編集しました。 – ChrisB

関連する問題