有没有办法授予尚不存在的表(或重新创建的表)的权限?

时间:2019-06-17 03:52:42

标签: sql database postgresql

我有一个设置了只读角色的数据库;我们称之为“ app_user_ro”。我正在使用第三方数据加载工具(以“ app_user”身份运行)删除并重新创建表。重新创建表后,先前的权限就消失了,并且'app_user_ro'不再可以从表中选择。

我正在使用在Ubuntu 19.04上运行的Postgres 11.3。我看过Grant privileges on future tables in PostgreSQL?并尝试更改默认权限,但是'app_user_ro'在删除并重新创建后仍然无法从表中读取数据。

我尝试过:

-- The accepted answer
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO app_user_ro;

-- An alternative answer from the comments:
ALTER DEFAULT PRIVILEGES FOR USER app_user_ro IN SCHEMA public GRANT SELECT ON TABLES TO app_user_ro;

唯一可行的方法是在每次导入后手动授予权限:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO app_user_ro;

docs状态:

  

您只能更改将由您自己或您所属的角色创建的对象的默认特权

我担任的角色是:

app_data_loader=# \du
                                      List of roles
   Role name    |                         Attributes                         | Member of  
----------------+------------------------------------------------------------+------------
 app_user       |                                                            | {postgres}
 app_user_ro    |                                                            | {}
 pg             | Superuser                                                  | {}
 postgres       | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

最初,我以{postgres”角色的身份运行ALTER DEFAULT...命令,但最近我在“ app_user”角色(加载数据的角色)中添加了“ app_user_ro”角色,并尝试将其作为“ app_user的角色,行为没有变化。

现在,我将安排一次作业在每次导入后授予权限,但似乎应该有更好的方法!

1 个答案:

答案 0 :(得分:2)

您缺少的难题是router.post('/api/auth2/signout', async ctx => { try { if (ctx.isAuthenticated()) { ctx.logout() ctx.cookies.set('koa:sess') ctx.cookies.set('koa:sess.sig') ctx.body = { status: 'success' } } else { ctx.status = 401; ctx.body = { status: 'error' }; } } catch (err) { console.log(err) } 仅影响通过ALTER DEFAULT PRIVILEGES子句中指定的角色创建的表(或者,如果您省略了,运行该语句的用户)。

因此,如果创建表的是FOR USER/ROLE,则必须运行

app_user