如何允许在Ubuntu中使用postgres访问CSV文件的权限

18 postgresql ubuntu

我使用以下命令:

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;  
Run Code Online (Sandbox Code Playgroud)

但是,它会出现以下错误:

********** 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.
Run Code Online (Sandbox Code Playgroud)

即使我改变了许可 ekodev@partner:~/Documents$ sudo chmod a+rwX /home/ekodev/ /home/ekodev/Documents/ /home/ekodev/Documents/test1.csv

它仍然不适合我.

有谁知道问题是什么?

frl*_*lan 16

没有文件:

COPY命名文件只允许用于数据库超级用户,因为它允许读取或写入服务器有权访问的任何文件.

这意味着,您的数据库用户需要拥有超级用户标志.你可以设置标志

ALTER ROLE <rolename> WITH SUPERUSER 
Run Code Online (Sandbox Code Playgroud)

因为这可能是安静的危险你是否考虑使用\ copy来自psql而不是从客户端复制数据.

  • 谢谢!更改用户&lt;username&gt;超级用户也可以。请注意,与“ copy”不同,“ \ copy”是psql元命令,如果您正在使用RPostgreSQL从R连接到DB,则该命令不可用。但是,您的解决方案可以从RPostgreSQL使用。 (2认同)

Ati*_*ska 12

这个解决方案对我有用\copy。ALTER不需要,因为它还需要管理员权限。

psql -h <host> -U <user> -d <dbname> -c "\copy <table_name> FROM '<path to csvfile/file.csv>' with (format csv,header true, delimiter ',');"
Run Code Online (Sandbox Code Playgroud)

  • 我尝试了这种方式,但得到:错误:关系类别的权限被拒绝 (3认同)

Bey*_*Gül 7

这对我的案例有用

sudo psql -h localhost -U root -d my_db -p 5432  -c "\COPY source_table TO  '/home/user/source_table.csv' DELIMITER ',' CSV HEADER;"
Run Code Online (Sandbox Code Playgroud)


小智 6

或者,您可以使用 pgAdmin 导入 csv 数据。当 SuperUser 角色不可用时工作,例如在 AWS 中。


Dan*_*ira 6

使用 postgres 用户从内部数据库:

sudo -u postgres psql
Run Code Online (Sandbox Code Playgroud)

更改文件的权限(所有用户都可以读取和写入):

chmod o+rw /tmp/amit.csv
Run Code Online (Sandbox Code Playgroud)

从特定表中获取数据:

\COPY table TO '/tmp/amit.csv' DELIMITER ',' CSV HEADER;
Run Code Online (Sandbox Code Playgroud)

  • 在 COPY 前面添加 \ 有效,谢谢! (2认同)