我正在尝试制作一个程序,它可以计算在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获得使用该文件。
2条答案
按热度按时间r1zk6ea11#
您是否在psql中以超级用户身份执行了该语句,并通过JDBC以另一用户身份执行了该语句?
manual tells us:
COPY命名文件仅允许数据库超级用户使用,因为它允许阅读或写入服务器有权访问得任何文件.
您 * 可以 * 通过使用超级用户拥有的
SECURITY DEFINER
将该语句 Package 在函数中来规避此限制。请注意安全风险。您可能还希望将所有权限从public授予REVOKE,而仅将GRANT授予选定的用户。可能如下所示:另外,请注意转义字符串的正确语法为:
请注意
E'...'
。从9.1版开始,默认情况下启用设置
standard_conforming_strings
,强制执行此设置。tjrkku2a2#
对于从文件进行一次性批量加载,切换 file 上的权限会更容易,而不会影响Windows和PostgreSQL用户的权限。
右击包含文件的文件夹,然后在“安全性”下,给予“每个人”读取文件的权限。完成后,删除“每个人”权限。这也可以使文件夹成为从Windows上的PostgreSQL转储数据时的“写入”目标。
在另一个answer中提供了分步指南。