42

I'm using PGAdmin 1.14.3.

When I try to execute an import command:

COPY grad(country_code, postal_code, place_name, admin_name1, admin_code1, admin_name2, admin_code2, admin_name3, admin_code3, latitude, longitude, accuracy)
FROM 'C:\\Users\\denis\\Desktop\\BP2Project\\USA\\US.txt';

I get a

ERROR: could not open file "C:\Users\denis\Desktop\BP2Project\USA\US.txt" for reading: Permission denied SQL state: 42501

I did look up other similar questions and none of them solved my issue.

I logged in as user "postgres" who is the superuser. I don't see why I'm missing permissions. I'm on Windows 7.

Community
  • 1
  • 1
Tool
  • 12,126
  • 15
  • 70
  • 120

10 Answers10

87

The permissions article mentioned in the answer by Houari and Flimzy is a good reference material, but a direct answer (the quick fix I used) is:

  • Right click the folder containing the data file(s) that permission was denied to and then click Properties.
  • In the Folder's Properties window, select the Security tab.
  • Click the Edit button.
  • In the "Permissions for the folder" window that opened, click the Add... button.
  • Type Everyone into the "Enter the object names to select" text area box.
  • Click OK and the window will close.
  • Verify that the default Read & Execute permissions were set to Allow via the check checkbox in the previous window.
    • As JLB notes, Write permission is needed if dumping from PostgreSQL, opposed to copying into it.
  • Click OK and the window will close.
  • Click the Apply button in the Folder Properties window.

Now you can run the SQL COPY statement that needs to access those files.

  • Once done, return to the Folder's Properties window.
  • Click the Edit button.
  • Select the Everyone entry in the "Group or user names:" field.
  • Click the Remove button.
  • Click OK on the remaining open windows.

The permissions have now been returned to what they were.

Kevin
  • 2,234
  • 2
  • 21
  • 26
15

The user Postgres must have read access on the file from which you are about to copy.

Look at this article to see how to modify files' security access on Windows.

Jonathan Hall
  • 75,165
  • 16
  • 143
  • 189
Houari
  • 5,326
  • 3
  • 31
  • 54
  • How do I set permissions to postgres then? – Tool Dec 29 '12 at 16:38
  • 2
    @Tool: The *system user* "postgres" needs the rights in the file system. Not to confuse with the *database user* "postgres". And we are talking about a file local to the *server*, right? If not, you can't use SQL `COPY` this way. Look for the [psql meta-command `\copy`](http://www.postgresql.org/docs/current/interactive/app-psql.html) in this case. – Erwin Brandstetter Dec 29 '12 at 17:33
  • 1
    I am using psql from cygwin. No Postgres or postgres user is found on my Windows box... – Cromax Jul 17 '16 at 14:29
11

Ok, this is how got COPY command working,to export a table to CSV, step by step. Pls note that I am using pgAdmin 111.

  1. Create the target folder you want to export a table to. E.g C:\myExports
  2. Set a read/write permission on this folder following the steps below :

Right click the folder containing the data file(s) that permission was denied >to and then click Properties.

In the Folder's Properties window, select the Security tab. Click the Edit button.

In the "Permissions for the folder" window that opened, click the Add... button. Type Everyone into the "Enter the object names to select" text area box.

Click OK and the window will close. Verify that the default Read & Execute permissions were set to Allow via the >check checkbox in the previous window. Click OK and the window will close.

Click the Apply button in the Folder Properties window.

  1. This is the tricky part, inside myExports folder create a blank CSV file with your desired name.E.g employee.csv

  2. Then run the Copy command like this :

    copy employee to 'C:\myExports\employee.csv' delimiter ',' csv;

employee is the table name in this example..

Hope this helps.

  • 1
    **NOTE** for me, when changing the permissions, I had to check ALL the boxes ("Full control", "Modify"...) for this to work!!! – DrMisha Sep 16 '16 at 21:10
5

If you don't want to give permissions to Everyone, you can add permissions to the account that started the service. In the Control Panel - Administrative Tools - Services, copy the account name in the 'Log On' tab. (On my system the account is called 'Network Service'.) Then share the folder with the CSV-file with this user as shown in the answer above.

Jonas B
  • 113
  • 2
  • 6
  • I've been trying everything else but I can never find "Everyone" or "postgres" or any other user mentioned in other answers. You saved me from going insane! – glazjoon Oct 18 '19 at 10:41
2

To solve this problem you must give permission to the CSV file because that CSV file present in a COPY command are read directly by the server, but not client application. So to make this file accessible to a server we must give full read-write permission so that Postgresql user can read and write on that file.

Reference: article showing step by step procedure.

Diwas Poudel
  • 781
  • 1
  • 11
  • 20
1

I just ran into this error and even after adding postgres to permissions on the file folder and the file itself, it still didn't work. So, I put the file in a public folder. On Windows this was the path: "C:\Users\Public\Documents\census.csv." It worked!

Debra Ray
  • 47
  • 3
0

Responses to this problem on different threads go something like this 1. "Tell me exactly what command you used" 2. "Make sure you have right permissions" 3. "Just use /copy"

I just tried giving permissions to Everyone on the cvs file I am trying to copy from, and it is still giving me the permission denied error. I think this functionality is broken and has been broken for multiple consecutive releases over multiple consecutive versions of Windows.

Alex
  • 1
  • On the second look, setting user permissions to 'Evereyone' seems to have some effect. – Alex Sep 19 '13 at 19:41
0

for me and I've just spent some long hours on this. I have a central db residing on a HP box running 14.04 postgresql-9.5 pgAdmin3 postgis-2.2, shares are made through a tweeked Samba share. My clients are using a mixture of windows 10.1, 7, 8.1 and I have one ubuntu 14.04 desktop.

I'm working with large tables updating records and normalising data and have built the routines around SQL copy statements from CSV files which were made from the core COPY public.table_1 TO (the share folder I'd set up in Samba https://www.youtube.com/watch?v=ndAYZ0DJ-U4) '/srv/samba/share/[filename].csv'

I can then update the database once the tables have been amended with COPY table_1 from '/srv/samba/share/test.csv' USING DELIMITERS ',' WITH NULL AS '' CSV HEADER; from any of my clients.

The key as far as I have been able to determine is that the clients doing the updating must be superusers, also everything must tie up in terms of users as there are 4 servers working together here Postgresql, Samba, UNIX and WINS All of my users are registered on each of the servers with the same username and password homogeneity is the main factor.

I had tried for a long time moving things about and trying various naming conventions but in the end it was http://www.postgresql.org/message-id/CFF47E56EA077241B1FFF390344B5FC10ACB1C0C@webmail.begavalley.nsw.gov.au that sorted me out it was like a big switch clicking in. chown 777 on your shares and group management was an important learning curve but., the hours I've spent on this will reap rewards down the line... Loving Ubuntu loving life and loving the spirit of open source but that just might be sleep deprivation kicking in... IT WORKS

Terry
  • 11
  • 4
0

I am trying to execute SQL commands directly from a file in psql 14, and landed the same error.

The reason is that "postgres" user is different from the 'admin' or the main user of the operating-system. So, this main user denies "postgres" to access files from its file system.

Although there is a way to bypass it.

Windows lets any user access the files in 'C:\Users\Public' and Linux distros allow files in '/tmp' folder to do the same.

So, whatever files you are trying to access from postgres' terminal, keep the files in

  • 'C:\Users\Public' for Windows
  • '/tmp' in Ubuntu

Read from the orginal source of this answer

hansrajswapnil
  • 549
  • 1
  • 6
  • 14
0

use \copy command from psql instead with this config:

sudo psql -U postgres -d <your-db> -c "\copy <your-query-or-table> TO '<pat-to-save-file>' WITH (FORMAT CSV)"
juan Isaza
  • 3,646
  • 3
  • 31
  • 37