Import CSV Permission denied

Hallo,

ich bin ein ziemlicher Anfänger, was postgreSQL angeht. Daher schildere ich mal kurz mein Problem. Ich möchte gerne eine CSV-Datei importieren und habe folgendes erstellt:

– Database: postgres

– DROP DATABASE postgres;

CREATE DATABASE postgres
WITH OWNER = postgres
ENCODING = ‘UTF8’
TABLESPACE = pg_default
LC_COLLATE = ‘German_Germany.1252’
LC_CTYPE = ‘German_Germany.1252’
CONNECTION LIMIT = -1;

COMMENT ON DATABASE postgres
IS ‘default administrative connection database’;



DROP TABLE IF EXISTS test_table;
CREATE TABLE test_table (
id SERIAL,
attr_1 INTEGER,
attr_2 TEXT,
PRIMARY KEY(id)
);

COPY test_table(attr_1, attr_2) FROM ‘C:\Users\UserX\Desktop\test.csv’ DELIMITER ‘;’ CSV HEADER;
SELECT * FROM test_table[/color][/color]

Unglücklicherweise kommt folgender Fehler

FEHLER: konnte Datei »C:\Users\UserX\Desktop\test.csv« nicht zum Lesen öffnen: Permission denied

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

FEHLER: konnte Datei »C:\Users\UserX\Desktop\test.csv« nicht zum Lesen öffnen: Permission denied
SQL state: 42501


Könnte mir jemand mir da weiterhelfen und mir sagen, wo der Fehler liegt. Ich habe das auf einem anderen Rechner getestet auf der Arbeit. Bei dem ging der Befehl einbahnfrei. Nur leider auf meinem Rechner nicht :frowning:

Das ist kein Fehler von PostgreSQL sondern ein Fehler in den Berechtigungen von deinem Windows bzw. deinem Windows Benutzerkonten oder besser gesagt da läuft es richtig…

Der PostgreSQL Server läuft unter einem anderen Benutzer als dein “UserX”. Deswegen hat dieser keinen Zugriff auf dessen Desktop und aus diesem Grund bekommst du ein Premission denied. Also alles korrekt.

Lösung: Leg einen temporären Ordner an (z. B. C:\temp) und kopiere dorthin die csv Datei hin und versuche es erneut. Dann sollte es klappen.

cu tb

Vielen Dank für deine Hilfe. Ich konnte damit mein Problem lösen. Beste Grüße Le

Hi,

die CSV-Dateien im Temp-Verzeichnis zu speichern hat geklappt. Jedoch soll dies nicht die Lösung seitens meines Arbeitgebers sein.

In pgAdmin III habe ich unter meinen lokalen Server (PostgresQL9.5) eine weitere Login Rolle namens X erstellt. Mit dem Login X habe ich eine neue Datenbank erstellt und versucht vom Desktop meine test.csv zu importieren, welches wiederum zur gleichen Fehlermeldung führt. Gäbe es eine andere Alternative auf die Importdateien auf meinem Windowsbenutzerprofil zuzgreifen?

mit COPY FROM STDIN arbeiten und die Daten in psql reinpipen. Das würde dann sogar klappen, wenn die Datenbank remote wäre.

Hi akretschmer,

danke für deine Antwort. Ich bin leider nicht so erfahren in SQL. Könntest du mir das vllt. anhand meines Beispiels erklären.


Ich hab im Inet mal nach dem Befehl recherchiert
COPY table_name (column1, column2,… ) FROM stdin;

Was genau heist STDIN und was macht es?
Wie kann man mit diesem Befehl auf die hinterlegte CSV Datei zurückgreifen, wenn der Pfad nicht angegeben ist.
Was meinst du genau mit “reinpipen”?
Was heisst remote?
Wo und wie kann ich eine Datenbank auf remote einstellen?

andreas@ThinkPad-T460p:~/muell$ psql test -c "select * from csv_demo";
 c1 | c2 | c3 | c4 
----+----+----+----
(0 rows)

andreas@ThinkPad-T460p:~/muell$ cat data.csv 
1 , 20 , 4 , 1498025053
2 , 21 , 4 , 1498025083
3 , 21 , 3 , 1498027025
4 , 21 , 4 , 1498030348
5 , 21 , 3 , 1498030407
6 , 21 , 1 , 1498030556
andreas@ThinkPad-T460p:~/muell$ psql test -c "copy csv_demo from stdin csv" < data.csv 
COPY 6
andreas@ThinkPad-T460p:~/muell$ psql test -c "select * from csv_demo";
 c1 | c2 | c3 |     c4     
----+----+----+------------
  1 | 20 |  4 | 1498025053
  2 | 21 |  4 | 1498025083
  3 | 21 |  3 | 1498027025
  4 | 21 |  4 | 1498030348
  5 | 21 |  3 | 1498030407
  6 | 21 |  1 | 1498030556
(6 rows)

andreas@ThinkPad-T460p:~/muell$

Remote ist eine Datenbank, wenn diese auf einem anderen Server läuft und nicht auf der lokalen Maschine. Ja, das geht tatsächlich …