web-dev-qa-db-fra.com

Comment autoriser l'accès au fichier CSV à l'aide de postgres dans Ubuntu

J'utilise la commande suivante:

copy (select so.name,
      so.date_order,
      sol.name,
      sol.product_Id,
      sol.product_uom_qty , 
      ai.number, 
      ai.date_invoice , 
      so.amount_total , 
      so.amount_tax 
      from sale_order so , 
      sale_order_line sol , 
      account_invoice ai 
      where so.id = sol.order_id 
      and so.name = ai.Origin 
      and ai.state='open') 

to '/home/ekodev/Documents/test1.csv' delimiter ',' csv header;  

Cependant, il donne l'erreur suivante:

********** Error **********

ERROR: must be superuser to COPY to or from a file
SQL state: 42501
Hint: Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.

Même lorsque j'ai changé l'autorisation ekodev@partner:~/Documents$ Sudo chmod a+rwX /home/ekodev/ /home/ekodev/Documents/ /home/ekodev/Documents/test1.csv

Ça ne marche toujours pas pour moi.

Quelqu'un sait-il quel est le problème?

16
user3946530

Hors documentation:

COPY nommer un fichier n'est autorisé qu'aux superutilisateurs de base de données, car il permet de lire ou d'écrire tout fichier auquel le serveur a des privilèges d'accès.

Cela signifie que votre utilisateur de base de données doit avoir le drapeau superutilisateur. vous pouvez définir le drapeau avec

ALTER ROLE <rolename> WITH SUPERUSER 

Comme cela peut être dangereux, avez-vous envisagé d'utiliser\copy à partir de psql pour copier les données côté client.

15
frlan

Cette solution a fonctionné pour moi en utilisant \copy. ALTER ne l'a pas fait car cela nécessitait également des privilèges d'administrateur.

psql -h <Host> -U <user> -d <dbname> -c "\copy <table_name> FROM '<path to csvfile/file.csv>' with (format csv,header true, delimiter ',');"
10
Atihska

Vous pouvez également utiliser pgAdmin pour importer des données csv. Fonctionne lorsque le rôle SuperUser n'est pas disponible, comme dans AWS par exemple.

1
David Smits

Le rôle qui exécute la requête doit être SUPERUSER to COPY FROM fichier. Sinon, vous ne pouvez copier qu'à partir de STDIN.

0
DrCabry