Vous n'êtes pas identifié(e).
Bonjour,
J’ai un problème avec l’utilisation d’un script SQL comportant une commande COPY TO.
Voici la partie SQL qui me pose problème :
PERFORM * FROM tmp WHERE affaire = choix_affaire AND partnumber = choix_partnumber AND mime_type = choix_type;
IF FOUND THEN
---------------------------------------------------------------------------------
--Début de la boucle FOR LOOP
---------------------------------------------------------------------------------
FOR i IN minid..maxid LOOP
directory1 := (SELECT tmp.date FROM tmp WHERE id = increment);
directory1 := substr (directory1, 1, 10); --Sélection de la date sans prendre en compte l'heure
directory2 := (SELECT tmp.name FROM tmp WHERE id = increment);
PERFORM * FROM tmp WHERE id = increment; --Vérification que la variable increment est égale à une valeur de la colonne id de la table tmp
IF FOUND THEN --FOUND prend la valeur true ou false en fonction de du résultat de la requête PERFORM
EXECUTE format ('COPY (SELECT data FROM tmp WHERE id = %L) TO ''D:/_users/BMI/test/' || directory1 || ' ' || directory2 ||'''(format binary)',increment);
END IF;
increment := increment + 1 ; --Changement de ligne à vérifier
END LOOP;
Cependant, même si le script fonctionne, la commande :
EXECUTE format ('COPY (SELECT data FROM tmp WHERE id = %L) TO ''D:/_users/BMI/test/' || directory1 || ' ' || directory2 ||'''(format binary)',increment);
, requière d’être super-utilisateur pour pouvoir faire un COPY, j’aimerais donc savoir s’il y a un moyen de contourner cette contrainte ?
Cordialement
BastienM
Dernière modification par BastienM (24/05/2017 14:08:23)
Hors ligne
Il n'est pas possible de lever cette limitation.
La seule option est de déclarer cette fonction (ou une autre responsable du copy uniquement) en SECURITY DEFINER, la créer en tant que super utilisateur et donner les doits aux utilisateurs devant l'appeler. Il s'agit bien évidemment d'une solution relativement dangereuse, vu que vous donnez des droits super utilisateur à un utilisateur standard.
Julien.
https://rjuju.github.io/
Hors ligne
Bonjour,
L'utilisation du droit SUPERUSER ne me dérangeant pas, j'ai trouvé une solution alternative.
J'ai modifier le rôle qui ouvre le fichier .sql avec un rôle SUPERUSER et au début et à la fin de mon fichier .sql, j'ai fais :
ALTER ROLE databaseuser WITH SUPERUSER;
et
ALTER ROLE databaseuser WITH NOSUPERUSER;
Cordialement
BastienM
Hors ligne