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

q0qdq0h2  于 2023-05-22  发布在  其他
关注(0)|答案(8)|浏览(191)

我正在使用以下命令:

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;

但是,它给出以下错误:

********** 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.

即使我更改了权限ekodev@partner:~/Documents$ sudo chmod a+rwX /home/ekodev/ /home/ekodev/Documents/ /home/ekodev/Documents/test1.csv
它仍然对我不起作用。
有人知道问题出在哪吗?

6xfqseft

6xfqseft1#

我使用\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 ',');"
tkqqtvp1

tkqqtvp12#

超出文件范围:
COPY命名文件只允许数据库超级用户使用,因为它允许阅读或写入服务器有权访问的任何文件。
这意味着,您的数据库用户需要具有超级用户标志。您可以使用以下内容设置标志

ALTER ROLE <rolename> WITH SUPERUSER

由于这可能是安静的危险,你是否考虑使用\copy from psql从客户端复制数据。

xxhby3vn

xxhby3vn3#

或者,您可以使用pgAdmin导入csv数据。当超级用户角色不可用时有效,例如在AWS中。

km0tfn4u

km0tfn4u4#

对我的案子很有效

sudo psql -h localhost -U root -d my_db -p 5432  -c "\COPY source_table TO  '/home/user/source_table.csv' DELIMITER ',' CSV HEADER;"
mzsu5hc0

mzsu5hc05#

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

sudo -u postgres psql

修改文件权限(所有用户均可读写):

chmod o+rw /tmp/amit.csv

从特定表中获取数据:

\COPY table TO '/tmp/amit.csv' DELIMITER ',' CSV HEADER;
jmp7cifd

jmp7cifd6#

GRANT pg_read_server_files TO <your user>;

没有必要像其他答案中建议的那样授予超级用户权限。

kcugc4gi

kcugc4gi7#

运行查询的角色必须是SUPERUSERCOPY FROM文件。否则,只能从STDIN复制。

h9vpoimq

h9vpoimq8#

以超级用户身份登录:

sudo -i -u postgres

连接到您的数据库:

psql database

授予您的用户访问权限:

postgres=# grant pg_read_server_files to user;

在此之后,在另一个选项卡中,当您以用户身份连接到数据库时:

psql database

您应该看到:

database=> \du
                                          List of roles
 Role name |                         Attributes                         |       Member of
-----------+------------------------------------------------------------+------------------------
 user      | Create DB                                                  | {pg_read_server_files}
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

这意味着user可以在sql中使用copy。我用csv做了几个测试,在我的测试中,我只能让它使用完整路径:

copy table_name from '/full/path/to/your/csv/file.csv' with (format csv);

相关问题