我将用户myuser添加到Postgres。

然后我在pgAdmin III GUI中添加了数据库mydatabase,并从备份文件中进行了还原。因此,mydatabase的所有者是超级用户postgres

然后我尝试授予所有访问权限,并将mydatabase修改为myuser。我以用户psql的身份登录postgres

psql -d template1 -U postgres  


,然后运行此查询:

GRANT ALL PRIVILEGES ON DATABASE mydatabase TO myuser


现在我可以使用myuser进行记录,但是如果我尝试一个简单的查询,则会出现以下错误:


ERROR:  permission denied for relation table_name



我缺少什么吗?你能帮我解决这个问题吗?

#1 楼

您已将数据库上的CREATECONNECTTEMPORARY特权授予myuser,但尚未授予SELECTINSERT表特权。您将需要以下内容:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO myuser;


此外,如果您有任何序列列或从序列中提取的其他列默认值,则还需要序列的特权。通常,USAGE特权足以执行INSERT操作,但是由于您要求"give all rights"

GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO myuser;


手册中有关GRANT的详细信息。

#2 楼

对已经存在的对象使用@Gord提供的命令。

您可能也想授予DEFAULT PRIVILEGES。因此,您的用户myuser也可以自动访问将来的对象。

可以按模式进行操作:

ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO myuser;


如果省略模式,它将适用于整个数据库:

ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO myuser;


仅适用于由指定角色创建的对象(默认为执行此命令的角色):

ALTER DEFAULT PRIVILEGES FOR ROLE administrator GRANT IN SCHEMA public ... ;


从PostgreSQL 9.0开始可用。
如果有的话,别忘了对GRANT赋予SEQUENCES特权。 (例如,作为串行列中默认值的来源。)

#3 楼

这个问题的其他答案是正确的,但请允许我提出另一个选择。还原数据库后,您可以控制还原数据库的用户。我不确定如何使用pgAdmin3执行此操作的具体细节,但是pg_dump和pg_restore实用程序包含允许执行此操作的特定选项。

如果使用pg_dump --no-owner,则转储文件将不包含任何内容。所有权恢复。还原使用--no-owner创建的转储时,用于还原的用户将拥有所有对象。如果您具有自定义格式的转储文件,并且正在使用pg_restore,则可以将--no-owner选项与pg_restore一起使用,以使其在还原数据库时跳过所有所有权还原。

请注意,这将需要用户进行还原以对数据库具有必需的权限,以创建转储文件中存在的对象。一般而言,在数据库级别向执行还原的用户授予“ CREATE”就足够了。