エラーメッセージは、マニュアル のように明確です。 これについて:
plgpsql関数は、トランザクションブロックによって自動的に囲まれます。それの長短:あなたはそれをすることはできません-直接。 DDLコマンドだけを呼び出せない特別な理由はありますか?
DROP database $mydb;
できます 追加のモジュール
dblink_exec()
このように:
CREATE OR REPLACE FUNCTION f_drop_db(text)
RETURNS text LANGUAGE sql AS
$func$
SELECT dblink_exec('port=5432 dbname=postgres'
,'DROP DATABASE ' || quote_ident($1))
$func$;
quote_ident()
SQLインジェクションの可能性を防ぎます。
電話:
SELECT f_drop_db('mydb');
成功すると、次のように表示されます。
接続文字列は、セッションが実行されているのと同じデータベースを指している可能性もあります。コマンドはトランザクションブロックの外部で実行され、2つの結果があります。
- ロールバックできません。
-
DROP DATABASE
を呼び出すことができます 関数内からの「プロキシ経由」。
FOREIGN DATA WRAPPER
を作成できます およびFOREIGN SERVER
接続を保存して通話を簡素化するには:
CREATE FOREIGN DATA WRAPPER postgresql VALIDATOR postgresql_fdw_validator;
CREATE SERVER your_fdw_name_here FOREIGN DATA WRAPPER postgresql
OPTIONS (hostaddr '12.34.56.78', port '5432', dbname 'postgres');
デフォルトのメンテナンスデータベースpostgres
を使用する 、これは当然の選択です。ただし、任意のデータベースが可能です。
それを利用した簡略化された関数:
CREATE OR REPLACE FUNCTION f_drop_db(text)
RETURNS text LANGUAGE sql AS
$func$
SELECT dblink_exec('your_fdw_name_here', 'DROP DATABASE ' || quote_ident($1))
$func$;