sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLのストアドプロシージャからデータベースを削除または作成します

    エラーメッセージは、マニュアル のように明確です。 これについて:

    plgpsql関数は、トランザクションブロックによって自動的に囲まれます。それの長短:あなたはそれをすることはできません-直接。 DDLコマンドだけを呼び出せない特別な理由はありますか?

    DROP database $mydb;
    

    できます 追加のモジュール dblink を使用して、これらの制限を回避します。 @Igor 提案されました。データベースごとに1回インストールする必要があります。コマンドを実行する(他の)関数ではなく、dblink関数を呼び出すものです。
    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$;
    


    1. mysqlクエリから複数のページを作成する

    2. 複数のテーブルからのINSERTINTOテーブル

    3. psqlを介してSQLスクリプトを実行すると、PgAdminでは発生しない構文エラーが発生します

    4. Mysql2つの日時フィールドを比較します