使用\i命令从文件读取时,postgreSQL权限被拒绝



这是我的问题:

myname@ubuntu:~$ sudo su postgres -c "psql template1"
Password: 
psql (9.1.6)
Type "help" for help.
template1=# i /create.sql
/create.sql: Permission denied

即使文件在桌面上,我也有这个问题。当我复制create.sql的文本并将其粘贴到那里时,它就工作了。

使用UBUNTU 12.10,postgresql 9.1

谢谢你的帮助。

如果您在windows中工作,您只需要传递用一个引号括起来的整个路径。

test-# i 'D:\person.sql' --- > note here double backslash not single

问题是您已经以用户postgres的身份启动了psql,并且您没有授予postgres用户读取SQL文件的权限。你需要给予它许可。最简单的方法是授予世界阅读权限:

chmod a+r create.sql

您可以通过更改umask来更改分配给文件的默认权限;搜索更多信息。有些程序很烦人地忽略了umask并设置了限制性的文件权限,所以您总是需要知道如何授予权限。参见man chmodman chown

顺便说一句,您正在使用一种非常复杂的方法来作为postgres用户启动psql。这会很好:

sudo -u postgres psql template1
请注意,/create.sql在文件系统(/)的根目录中指定了一个名为create.sql的文件。我怀疑这是你的本意。

如果它在您的主目录中,您可能希望将其指定为一个相对路径(没有前导/),例如:

template1=# i create.sql

或者如果它在桌面上,并且您已经在主目录中启动了psql

template1=# i Desktop/create.sql

EDIT:如果您在linux上,一个更好的解决方案是将SQL文件移动到tmp文件夹!

我在Linux上遇到了同样的问题,但在我的情况下,公认的解决方案还不够。我最终意识到,您需要确保路径中的每个文件夹都具有正确的权限。

例如,如果主文件夹没有正确的权限,那么在SQL文件夹中为文件授予什么权限并不重要。

/home/username/Documents/SQL 

如果您在报价后遇到同样的问题,则使用正斜杠作为路径

权限问题可以通过更改每个子目录的权限来解决。

chmod og+rX /home /home/user

这应该可以解决问题。

附言:由于这些文件的权限被设置为其他人读取和执行,因此可能存在安全风险

它之所以有效,是因为当您将create.SQL的整个内容直接复制并粘贴到终端时,您基本上是以当前用户的身份执行SQL语句,而不是读取文件。另一方面,为了在psql中使用\i命令,文件访问权限是必不可少的。

请确保允许使用psql命令的用户访问文件/create.sql,并且它具有适当的权限。ls-l命令可用于确保权限:

ls -l /create.sql

确保执行psql命令的用户能够读取该文件。使用chmod命令,如果您发现这些权限非常严格,您可以修改它们:

sudo chmod +r /create.sql

如果文件保存在具有限制权限的目录中,也可能会出现问题。确保为/create.sql:的父目录设置了必要的权限

ls -ld /path/to/parent_directory

最新更新