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

时间:2012-01-15 05:41:19

标签: postgresql jdbc

我正在尝试创建一个程序来计算在postgres中执行查询所用的时间。我正在使用JDBC来实现此目的。我使用

批量加载文件data.csv
copy 

语句。当我尝试执行命令

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

使用cmd提示符,执行。但是当我尝试使用java和JDBC执行相同的命令时,它会产生错误

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

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

1 个答案:

答案 0 :(得分:1)

您是否在psql中以超级用户执行语句,并通过JDBC执行另一个用户? manual tells us

  

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

可以通过将语句包装在超级用户拥有的SECURITY DEFINER的函数中来绕过此限制。请注意security risks。您可能还希望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;

另外,请注意the proper syntax for escape strings是:

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

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