Vous n'êtes pas identifié(e).
Bonjour,
Je viens vers vous car je cherche une solution répondant au problème qui suit.
J'ai une BDD PostgreSQL 9.3 contenant une table me permettant de faire la traçabilité de pièces. Cette table doit être mise à jour par des fichiers .csv distant. Le soucis est que pour récupérer ces données, je dois me connecter à des ordinateurs sous Windows XP et Seven qui ont un login et un mot de passe de session chacun différent.
Ma requête actuelle non fonctionnelle est là suivante :
COPY "nom_de_la_table" FROM '\\adresse_ip\fichier.csv' DELIMITER ';' CSV HEADER ;
Lorsque je l'exécute, l'erreur suivante me parvient:
ERREUR: n'a pas pu ouvrir le fichier « \\adresse_ip\fichier.csv » pour une lecture : Invalid argument
********** Erreur **********
ERREUR: n'a pas pu ouvrir le fichier « \\adresse_ip\fichier.csv » pour une lecture : Invalid argument
État SQL :XX000
Pourriez vous me dire s'il existe une solution me permettant de me loguer sur chaque ordinateur en intégrant le login et le mot de passe dans la requête SQL?
Merci d'avance pour votre réponse,
Skullmachine
Dernière modification par Skullmachine (09/12/2014 13:55:12)
Hors ligne
La commande COPY ne le permet pas. La seule solution que je vois est d'écrire un outil qui ferait la connexion et lancerait le COPY.
Guillaume.
Hors ligne
Bonjour
Si vous êtes sous Windows, pourquoi pas un script en PowerShell du style :
#connexion au réseau
$login= "toto"
$mdp= "titi"
$obj = New-Object -com Wscript.Network
$obj.MapNetworkDrive("K:","\\192.168.1.10\mondossier", "False", $login, $mdp)
#lancement de la commande PG
& "C:\Program Files\PostgreSQL\9.3\bin\psql.exe" -h localhost -p 5432 -d mabase-U monuser-c "select mafonction();"
Hors ligne
Bonjour,
Merci pour vos réponse rapide.
Est ce que du coup mafonction() est une fonction SQL qui lancerait mon COPY?
Merci
Hors ligne
oui c'est une fonction créée de manière tout à fait classique en SQL ou PL/pgSQL avec CREATE OR REPLACE FUNCTION mafonction().......
et qu'on appelle ensuite avec un select mafonction()
Attention aux antislashes (\), il me semble que PG considère ça comme un caractère d'échappement, ils ne sont donc pas admis pour les chemins des fichiers (ne pas oublier que Postgres vient du monde UNIX); il faut donc noter un truc du genre C:/temp/moncsv.csv
Hors ligne
Après la création du script PowerShell:
#connexion au réseau
$login= "login"
$mdp= "mdp"
$obj = New-Object -com Wscript.Network
$obj.MapNetworkDrive("K:","\\adress_ip\dossier", "False", $login, $mdp)
#lancement de la commande PG
& "C:\Program Files\PostgreSQL\9.3\bin\psql.exe" -h localhost -p 5432 -d postgres -U postgres -c "select dataimport();"
Puis la création de la fonction sur pgAdmin III:
CREATE OR REPLACE FUNCTION dataimport()
RETURNS void AS
$BODY$COPY "tracabiliteImport" FROM 'K:/fichier.csv' DELIMITER ';' CSV; -- Ici j'ai un slash au lieu d'un anti slash$BODY$
LANGUAGE sql VOLATILE
COST 100;
ALTER FUNCTION dataimport()
OWNER TO postgres;
Lorsque que le script PowerShell est lancé, le connecteur réseau est bien créé (K:). L'authentification à la base s'est faite correctement. Cependant, l'erreur suivante survient:
ERREUR: n'a pas pu ouvrir le fichier K:\fichier.csv pour une lecture : No such file or directory
C'est incompréhensible car mon fichier se trouve à la bonne arborescence. (\\adress_ip\dossier\fichier.csv)
Dernière modification par Skullmachine (27/11/2014 12:54:48)
Hors ligne
Ah petite subtilité (logique) que j'avais oublié : le serveur va traiter un fichier qui est sur.....le serveur!!
il faudrait modifier le script powershell, copier votre fichier dans un repertoire, le traiter, (le supprimer)
#copie en PS
$dossier = 'C:\temp'
Copy-Item -Path "Q:\moncsv.csv" -Destination $dossier
Hors ligne