我将用户
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 楼
您已将数据库上的CREATE
,CONNECT
和TEMPORARY
特权授予myuser
,但尚未授予SELECT
和INSERT
表特权。您将需要以下内容: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”就足够了。