Vous n'êtes pas identifié(e).

#1 17/04/2018 18:22:33

DROP DATABASE cannot run inside a transaction block

Bonjour,

J'ai une fonction qui, entre autres, droppe une db et la recrée mais je reçois un message d'horreur !

CREATE OR REPLACE FUNCTION public.recreate_sdbx_user(
	pg_user_name text)
    RETURNS boolean
...
    sql_stmt = 'drop database if exists sdbx_' || pg_user_name;
    
    execute sql_stmt;
...

    sql_stmt =   'create database sdbx_'
    			|| pg_user_name 
                        || ' template sdbx_generic '
                        || ' tablespace sdbx;'
                
    execute sql_stmt;

...
    

et je reçois le message

DROP DATABASE cannot run inside a transaction block

Que faire ,

Merci pour votre attention

Hors ligne

#2 17/04/2018 21:51:09

gleu
Administrateur

Re : DROP DATABASE cannot run inside a transaction block

Bah rien. C'est pas possible, c'est tout smile


Guillaume.

Hors ligne

#3 19/04/2018 09:22:57

Re : DROP DATABASE cannot run inside a transaction block

@gleu

Je suis heureux qu'une telle tragédie ne vous fasse pas perdre le sourire...

Pourriez-vous me dire en deux mots les raisons pour lesquelles la chose est impossible ?

Il me souvient d'avoir eu des problèmes similaires en Oracle (il y a longtemps).

Par ailleurs, un grand merci à Dalibo pour l'organisation de certifications !

C'est un grand pas en avant !

Hors ligne

#4 19/04/2018 12:21:12

gleu
Administrateur

Re : DROP DATABASE cannot run inside a transaction block

La suppression d'une base passe par la destruction du répertoire de la base. La suppression d'un répertoire n'est pas une opération réversible, du coup ça ne peut pas être placé dans une transaction. Tout comme la destruction d'un tablespace.

Pour être complet, CREATE DATABASE, CREATE TABLESPACE, DROP DATABASE et DROP TABLESPACE ne peuvent pas être utilisés dans une transaction. Ce sont les seules instructions de ce genre à ma connaissance.


Guillaume.

Hors ligne

#5 19/04/2018 13:18:38

Re : DROP DATABASE cannot run inside a transaction block

Je comprends à présent. Merci pour vos explications.

Mais si on se connecte à la db postgres, n'y aurait-il pas moyen d'exécuter ces commandes en faisant comprendre à la function qu'il ne s'agit pas d'une transaction.

Par ailleurs, un grand merci à Dalibo, pour la publication des formations !

Hors ligne

#6 19/04/2018 15:13:09

gleu
Administrateur

Re : DROP DATABASE cannot run inside a transaction block

Peut-être que c'est possible avec dblink. Mais si c'est bien le cas, si la fonction échoue, la base sera quand même supprimée. Par exemple, en reprenant le code ci-dessus, on pourrait supprimer la base, tout en ayant une erreur à la création de la base. À mon avis, ça serait contre-intuitif, et de ce fait, à éviter.


Guillaume.

Hors ligne

Pied de page des forums