这是我的问题:
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 chmod
和man 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