我将用户添加myuser
到 Postgres。
然后我mydatabase
在 pgAdmin III GUI 中添加了数据库并从备份文件中恢复。所以所有者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
我错过了什么吗?你能帮我解决这个问题吗?
您已授予
CREATE
、CONNECT
和数据库TEMPORARY
权限,但尚未授予和表权限。你需要类似的东西:myuser
SELECT
INSERT
此外,如果您有任何序列列或从序列中提取的其他列默认值,则您需要对序列的权限。通常,该
USAGE
特权足以使INSERT
操作正常工作,但是既然您要求"give all rights"
:手册中有详细说明
GRANT
。使用@Gord为已经存在的对象提供的命令。
您可能也想授予
DEFAULT PRIVILEGES
。因此,您的用户myuser
也可以自动访问未来的对象。可以按模式完成:
如果省略模式,它适用于整个数据库:
仅适用于由指定角色创建的对象(默认为执行此命令的角色):
从 PostgreSQL 9.0 开始可用。
如果您有任何其他权限,请不要忘记添加
GRANT
权限SEQUENCES
。(例如,作为序列列中默认值的来源。)虽然这个问题的其他答案是正确的,但请允许我提出另一种选择。还原数据库时,您可能能够控制数据库还原为的用户。我不确定如何使用 pgAdmin3 执行此操作的具体细节,但 pg_dump 和 pg_restore 实用程序包含允许执行此操作的特定选项。
如果您使用
pg_dump --no-owner
,则转储文件将不包括任何所有权恢复。当您恢复使用 创建的转储时--no-owner
,您用来执行恢复的用户将拥有所有对象。如果你有一个自定义格式的转储文件并且正在使用 pg_restore,你可以使用--no-owner
pg_restore 选项让它在恢复数据库时跳过任何所有权恢复。请注意,这将要求执行还原的用户对数据库具有必要的权限,以创建转储文件中存在的对象。一般来说,将数据库级别的“CREATE”授予执行还原的用户就足够了。