PostgreSQL:创建角色不起作用

10

在运行rake db:create:all时,我遇到了“FATAL role does not exist”错误。

这篇帖子也提出了同样的问题,但答案并不起作用。

Travis CI: FATAL: role does not exist

我通过以下方式进入postgresql控制台:'sudo -u postgres psql'

输入

CREATE ROLE X SUPERUSER 
CREATE ROLE X CREATEDB LOGIN 

在postgres=#提示符下,无论输入任何内容,都不会有任何反应。绝对没有成功或失败的消息,也没有任何确认消息。

当我输入\du来列出角色时,只有postgres角色存在。


5
执行命令时是否必须以分号(;)结尾? - iouri
谢谢 - 我休息了一下,因为PSQL让我崩溃了。 - fIwJlxSzApHEZIl
2个回答

17
我发现,就像MySQL一样,postgresql要求在命令的末尾使用分号。我已经习惯了MS SQL不需要这样做。

几乎所有的 SQL 工具都需要使用 ; 来终止 SQL 语句。微软的工具是唯一一个没有做到这点的:一些语句不需要 ;,一些似乎需要在开头加上它(例如 WITH),而一些则绝对需要它(例如 MERGE - 即使从编程语言中发送也不能没有 ;)。这完全不一致且令人困惑。 - user330315
“WITH”不需要放在开头,那只是人们为了对抗通常不将它们放在语句末尾的惯例而采用的惯例... 在我看来,这是解决错误问题的一个例子。 - araqnid
MS SQL通常使用“go”在前端命令中终止单行。我记得在存储过程或函数定义中,内部使用分号来终止语句。 - Chris Travers

2

当执行CREATE ROLE时,您应该收到一个确认消息,显示CREATE ROLE。

如果没有发生这种情况,可能是因为该语句未发送到服务器。正如其他人指出的那样,您缺少命令末尾的分号;。按Ctrl-C取消当前命令并重新开始。CTRL-C仅中止当前命令,而不会终止psql,所以不用担心。

关于psql命令行工具的一个好处是提示符会告诉您很多信息。如果您登录,您会看到类似postgres=#的东西。

postgres是数据库名称,=是行状态(请参见下面的更多信息),#表示您是超级用户。如果您不是超级用户,则最后一个字符将是>。

行状态很有趣,它可以是以下任何一种:

  • =表示新命令行(即未继续、引用等)
  • -表示继续行
  • $表示使用$quote$语法的引用字符串
  • '表示使用'literal'语法的引用文字
  • "表示使用"identifier"语法的引用标识符

了解这一点并注意提示符可以节省无数问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接