2012-03-17 10 views
0

私のアプリケーションはPostgreSQL 9.1データベースを使用しています。私たちはベータ段階にあり、私たちは時々PostgreSQLスキーマでバグを見つけます。私たちはインストーラを書いて作業していますが、今は、次のリリースを行うときに更新が必要なインストールがある時点です。データベーススキーマ更新スクリプトをPostgreSQL 9.1で動作させるにはどうしたらいいですか?

ここで私のスクリプトをどのように決定するかを尋ねる以前の質問を投稿しました。私が行った答えは、DOステートメントを使用することでした。これは素晴らしいですが、私は問題に遭遇しました。

インストールされた最後のバージョンを追跡するテーブルをデータベースに追加しました。私のスクリプトは次のようになります。

ほとんどのステートメントは、CREATEステートメントやDROPステートメントのような簡単な文です。しかし、この次のリリースでやるべきことの1つは、ストアド・ファンクションにコード変更を適用することです。この関数はplpgSQLでも書かれています。このストアドプロシージャは2つの$$記号を使用しているので、上記のコードで3つの$$$記号を使用しました。これは、入れ子になったplpgSQLの外観が異なるようにして、ドル記号の第2セットを最初に終了させない。

しかし、PostgreSQLがストアドプロシージャのDECLARE文に当たるとエラーが発生します。関数のテキストは引用符で囲まれていません。

ドングの正しい方法は何ですか?私はストアドプロシージャをこのDOブロックの外に置いて、それを宣言するためにCREATE OR REPLACEステートメントを使用するだけですか?あるいは、コードを条件の中に入れておくことができる方法はありますか?

トニー

答えて

2

試してみてください。

DO $outer$ 
BEGIN 
    IF NOT EXISTS (SELECT * FROM "CarSystem"."CarSystem_Versions" WHERE "VersionId" = 2) THEN 

     -- Schema update statements go here 

    END IF; 
END; 
$outer$ LANGUAGE plpgSQL; 

4.1.2.4. Dollar-quoted String Constants

+0

ありがとうございます!私は明日そのショットを与え、私はそれを動作させることができるかどうかを確認します。私が必要とするものとまったく同じように聞こえる。 –

+0

それは私のために働いた!再度、感謝します! –

関連する問題