1

レガシーでPostgreSQLデータベースを使用するプロジェクトをいくつか取得しました.19のストアドプロシージャ(関数)と約70のビューを使用しています。

ここで、ライブ データベースを更新しました。postgres の制限により関数が変更され、すべての関数とビューを削除して再作成する必要があるため、かなりの時間を費やしました。

依存関係に気を配り、適切な順序で行う方法で、postgress の関数とビューを自動的に変更する方法はありますか。

上位レベルのビューを作成する基本的なビューがあります...少なくとも私にとっては、少し複雑なデータベースです:)

ありがとう

4

2 に答える 2

2

これを行う最も簡単な方法は、データベースをテキスト ファイルにバックアップすることだと思います。

pg_dump database_name > database_name.pg_dump

そうしないと、バックアップからデータベースを復元するのが難しくなるため、それらは適切な依存関係の順序になります。バックアップ ファイル内の関数とビューの定義を編集し、新しいデータベースに復元することができます。

データベース バックアップ ファイルが大きすぎてエディターで編集できない場合、Postgres 9.2 以降では、それを 3 つのセクションに分割できます。

pg_dump --section=pre-data > database_name.1.pg_dump
pg_dump --section=data > database_name.2.pg_dump
pg_dump --section=post-data > database_name.3.pg_dump

小さい最初のセクションのみを編集します。古いバージョンでは、たとえばsplitユーティリティを使用できました。

バックアップと復元に必要なダウンタイムを許容できない場合は、さらに複雑になります。ただし、バックアップ ファイルを使用することをお勧めします。Postgres はトランザクションで DDL をサポートしていることを思い出してください。トランザクションで関数とビューをインポートしてエラーが発生した場合は、すべての変更をロールバックして修正し、再試行するだけです。

于 2013-03-13T20:13:23.187 に答える
0

「簡単」な方法はありません。IMO の最善のアプローチは、最初に準備を整え、SQL スクリプトとバージョン管理を使用してこれを行う方法を設定することです。

LedgerSMB で行うことは、関数定義を一連の .sql ファイルに保持することです。これは、Subversion で追跡されます。次に、それらをリロードするスクリプトがあります。これまでにセットアップしたことがない場合は、セットアップに多少の作業が必要になります。これを行う最も簡単な方法は次のとおりです。

pg_dump -s > ddl_statements_for_mydb.sql

次に、関数定義をコピーして貼り付けることができます (CREATE を CREATE OR REPLACE に変更するか、必要に応じて DROP IF EXISTS を追加します)。次に、使用可能なチャンクにモジュール化し、すべてのチャンクを正しい順序でデータベースに再ロードするスクリプトを用意します。現在すべてをセットアップするための時間と労力は、将来的には何倍も節約されます。これは、テスト、ステージング、および運用アカウントに予測可能な方法で変更を適用し、ダウンタイムをほとんど発生させずに (方法によっては、ダウンタイムをまったく発生させないことさえあります)あなたはそれを構造化します)。

于 2013-03-18T14:04:50.767 に答える