我正在尝试创建一个程序来计算在postgres中执行查询所用的时间。我正在使用JDBC来实现此目的。我使用
批量加载文件data.csvcopy
语句。当我尝试执行命令
时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使用该文件。
答案 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
已启用,强制执行此操作。