Vous n'êtes pas identifié(e).
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
Bah rien. C'est pas possible, c'est tout
Guillaume.
Hors ligne
@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
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
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
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