web-dev-qa-db-ja.com

1つのスクリプトで複数のデータベースを削除する

1つのSQLスクリプトでPostgreSQL上の複数のデータベースを削除する方法を理解しようとしています。 pgAdminコンソールで実行した場合とpsqlコマンドラインツールで使用した場合の両方で機能することが必要です。私がする時:

DROP DATABASE db1;
DROP DATABASE db2;

次のエラーが発生します。

DROP DATABASEは関数またはマルチコマンド文字列から実行できません

この問題を回避する方法はありますか?つまり、各コマンドを個別に実行する方法(MSSQLで「GO」ステートメントを使用する場合など)、または複数のデータベースを簡単に削除する他の賢明な方法はありますか?開発中のメンテナンススクリプトにこの機能が必要です。

5
Tomas

pgAdminのスクリプトで複数のコマンドを実行すると、それらは自動的にトランザクションにラップされます。 beginおよびcommitトランザクションを明示的に実行できますが、トランザクションコンテキストで実行されないコマンドを使用することはできません。 マニュアル:

DROP DATABASEは、トランザクションブロック内では実行できません。

psql-c commandを指定して呼び出すと同様です。 マニュアル:

コマンド文字列に複数のSQLコマンドが含まれる場合、複数のトランザクションに分割するために文字列に明示的なBEGIN/COMMITコマンドが含まれていない限り、それらは単一のトランザクションで処理されます。

ただし、psql標準入力を介して:

これは、psqlが各SQLコマンドを個別に送信するため、同じ文字列がファイルから読み取られるか、psqlの標準入力に供給される場合の動作とは異なります。

この動作のため、1つの-c文字列に複数のSQLコマンドを配置すると、予期しない結果になることがよくあります。繰り返しの-cコマンドを使用するか、複数のコマンドをpsqlの標準入力にフィードすることをお勧めします。たとえば、上記のエコーを使用するか、シェルのhere-documentを使用します。次に例を示します。

psql <<EOF
\x
SELECT * FROM foo;
EOF

したがって、デフォルトで標準入力でpsqlを使用できます autocommit-onmode
それ以外の場合、実行できるのは個別のコマンドだけです。

シェルコマンド dropdb -を使用するか、複数のデータベースを削除するシェルスクリプトを記述できます。

ところで、pgAdminとpsqlから実行できるものの唯一の違いは、SQLではない psqlのメタコマンド です。これらはデータベースエンジンではなく、psqlによって解釈されます。メタコマンドとSQLを切り替えるには、セパレータメタコマンド\\を使用します。 マニュアルの例 があります。

6