postgresql 尝试使用JDBC读取postgres数据库的csv文件时权限被拒绝

gcuhipw9  于 2022-12-03  发布在  PostgreSQL
关注(0)|答案(2)|浏览(166)

我正在尝试制作一个程序,它可以计算在postgres中执行一个查询所花费的时间。我正在使用JDBC来实现这个目的。我正在使用

copy

语句。当我尝试执行该命令时

copy data_1 from 'C:\\Users\\Abhishek\\Desktop\\data1.csv' using delimiters ','"

但当我尝试使用java和JDBC执行相同的命令时...它给出错误

org.postgresql.util.PSQLException: ERROR: could not open file for reading: Permission denied

我如何更改文件的权限,以便我可以帮助我的jre获得使用该文件。

r1zk6ea1

r1zk6ea11#

您是否在psql中以超级用户身份执行了该语句,并通过JDBC以另一用户身份执行了该语句?
manual tells us
COPY命名文件仅允许数据库超级用户使用,因为它允许阅读或写入服务器有权访问得任何文件.
您 * 可以 * 通过使用超级用户拥有的SECURITY DEFINER将该语句 Package 在函数中来规避此限制。请注意安全风险。您可能还希望将所有权限从public授予REVOKE,而仅将GRANT授予选定的用户。可能如下所示:

CREATE OR REPLACE FUNCTION foo()
  RETURNS void AS
$BODY$
    COPY data_1
    FROM E'C:\\Users\\Abhishek\\Desktop\\data1.csv'
    USING delimiters ',';
$BODY$
  LANGUAGE sql VOLATILE SECURITY DEFINER
  SET search_path = public, pg_temp;  -- or whatever schema the table is in

REVOKE ALL ON FUNCTION foo() FROM public;
GRANT SELECT ON FUNCTION foo() TO my_user;

另外,请注意转义字符串的正确语法为:

E'C:\\Users\\Abhishek\\Desktop\\data1.csv'

请注意E'...'
从9.1版开始,默认情况下启用设置standard_conforming_strings,强制执行此设置。

tjrkku2a

tjrkku2a2#

对于从文件进行一次性批量加载,切换 file 上的权限会更容易,而不会影响Windows和PostgreSQL用户的权限。
右击包含文件的文件夹,然后在“安全性”下,给予“每个人”读取文件的权限。完成后,删除“每个人”权限。这也可以使文件夹成为从Windows上的PostgreSQL转储数据时的“写入”目标。
在另一个answer中提供了分步指南。

相关问题