我在postgresql中有一个名为testview的视图。
我创建了一个名为testuser的新用户。
我希望testuser拥有数据库中所有表和视图的所有权限。
为此,我运行了以下命令:
GRANT ALL PRIVILEGES ON DATABASE testdb TO testuser;
GRANT USAGE ON SCHEMA public TO testuser;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO testuser;
testuser现在可以访问数据库中的所有表,但是如果我尝试运行SELECT * FROM testview,我会收到以下错误:关系testview的权限被拒绝。
有什么问题? testuser如何访问testview?
答案 0 :(得分:11)
我同意它应该有用。权限GRANT ... ON ALL TABLES
也应包含视图。
在授予testuser
权限后,您是否创建了视图?如果是,那么它没有与其他表相同的权限。这是因为GRANT ... ON ALL TABLES
表示“在当前存在的所有表上”。要包含您将来创建的表/视图,您可以说:
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO testuser;
或者,如果您想提供的时间超过SELECT
,则可以改为ALL PRIVILEGES
。
我认为ON ALL TABLES
的这种行为是关于Postgres权限的最容易被误解的内容之一,并且它在标准文档中并没有真正被提及,所以我试着在我自己的{{3}中强调它。 }。
答案 1 :(得分:3)
postgres=# GRANT ALL PRIVILEGES ON DATABASE testdb TO testuser;
postgres=# GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO testuser;
GRANT USAGE on schema: GRANT USAGE ON SCHEMA schema_name TO username;
Grant SELECT for a specific table: GRANT SELECT ON tbl_loans_new TO oloffm;
Grant SELECT for multiple tables: GRANT SELECT ON ALL TABLES IN SCHEMA schema_name TO username;