Сообщение об ошибке так же ясно, как и руководство по этому вопросу. :
DROP DATABASE не может выполняться внутри блока транзакции.
Функция plgpsql автоматически окружается блоком транзакции. Короче говоря: вы не можете сделать это - напрямую. Есть ли конкретная причина, по которой вы не можете просто вызвать команду DDL?
DROP database $mydb;
Вы можете обойти эти ограничения с помощью дополнительного модуля dblink как @ - предложил Игорь. Вам необходимо установить его один раз для каждой базы данных - той, в которой вы вызываете функции dblink, а не той (другой), в которой вы выполняете команды.
Позволяет вам написать функцию, используя _ 3_ вот так:
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');
В случае успеха вы увидите:
УДАЛИТЬ БАЗУ ДАННЫХ
Строка подключения может даже указывать на ту же базу данных, в которой запущен ваш сеанс. Команда выполняется вне блока транзакции, что имеет два последствия:
- Откатить нельзя.
- Он позволяет вам вызывать
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$;
person
Erwin Brandstetter
schedule
07.03.2013
dblinkподключиться к любой базе данных в этом кластере (кроме той, которую вы хотите удалить) и выполнитьDROP DATABASE IF EXISTS db_1;изdblink. - person Ihor Romanchenko   schedule 07.03.2013