web-dev-qa-db-ja.com

類似した名前パターンを持つスキーマのグループを削除する

いくつかのオブジェクトの名前が唯一の変数である、本質的に同じ操作の束を実行する必要がある状況を考えてみましょう。

私の場合、シェルグロビングの用語を使用するために、ceu_shard_test_merge_*という形式のすべてのスキーマを削除する必要があります。したがって、概念的には、これは次のように書くことができます。

DROP SCHEMA ceu_shard_test_merge_* CASCADE;

unixシェルとの類推による。

もちろん、このコマンドは機能しないので、どうすれば単一のコマンドでこれを実行できますか?私の理解では、これは移植性のある方法で行うことはできません。私はPostgreSQL 8.4を使用していますが、PGの最新バージョンのメソッドも問題ありません。

ソリューションに予行演習またはダミーのオプションがあった場合、実際に実行する前にどのコマンドが実行されるかを確認できると便利です。おそらく、コマンドを印刷する方法ですか?

また、与えられた例よりも一般的なパターンをどのように処理するかを示すのは、Niceです。

3
Faheem Mitha

システムカタログに対するこのクエリは、必要なDDLスクリプトを作成します。

_SELECT string_agg(format('DROP SCHEMA %I CASCADE;', nspname), E'\n')
FROM   pg_namespace
WHERE  nspname LIKE 'ceu_shard_test_merge_%';
_

format() を使用して、必要に応じて識別子をエスケープすることに注意してください。

format()にはPostgreSQL 9.1以降が必要です。
古いバージョンでは quote_ident() に置き換えます。

string_agg() には、PostgreSQL 9.0以降が必要です。
古いバージョンではarray_to_string(array_agg(...), E'\n')に置き換えます。

Postgres 8.4の場合、次のようになります。

_SELECT array_to_string(
          array_agg('DROP SCHEMA ' || quote_ident(nspname) || ' CASCADE;')
        , E'\n')
FROM ...
_

戻り値:

_DROP SCHEMA ceu_shard_test_merge_1 CASCADE;
DROP SCHEMA ceu_shard_test_merge_2 CASCADE;
...
_

実行前に検査できます。

すべてをDOコマンドに入れて自動実行するか、関数を作成して繰り返し使用できます。完全なコード例については、この密接に関連する回答を検討してください。

またはこれ SOに関する関連する回答

Psqlでの出力

@ Stewのコメント への応答:psqlで結果として装飾されていないテキストを表示するには、 _\pset_ メタコマンドを使用できます。

_\pset format unaligned
\pset tuples_only
_

または、短いコマンド_\x \a_を使用します

6

EXECUTEを使用してプロシージャを記述し、information_schemaテーブルからのクエリに一致するスキーマのリストをループして、プロシージャ内にステートメントを作成できます。

次に、psqlまたは他の 'ceu_shard_test_merge_%'などの基準を渡して、プロシージャを呼び出すことができます。

あなたはそれを行うためのパラメータを持っているか、単にドライランして、実行する代わりに、それらの行に沿ってステートメントまたは何かを出力することができます。

2
ETL