我正在构建一个Spring Boot应用程序。 Flyway数据库迁移在应用程序启动时执行。
我决定使用两个不同的角色: role__app (表的读/写权限, app 模式中的序列)和 role__migration (应用 / 迁移模式中的高级权限)。
Flyway迁移是在 role__migration 下执行的,因此它将成为已创建对象的所有者。我认为以下陈述会有所帮助:
ALTER DEFAULT PRIVILEGES IN SCHEMA app GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO role__app;
ALTER DEFAULT PRIVILEGES IN SCHEMA app GRANT USAGE ON SEQUENCES TO role__app;
但是,当将新表添加到 app 模式时, user__app (属于 role__app )将无权访问表。
是否可以通过Postgres或任何其他方式来维持这样的流程(与应用程序,迁移用户/角色)?
作为旁注,我应该提到在目标数据库上运行以下语句:
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
REVOKE ALL ON DATABASE myDb FROM PUBLIC;
更新1
我添加了FOR ROLE
子句,但仍然收到用户 user__app 在应用模式中创建的表( app.property )的权限被拒绝消息强>。该表的所有者是 user__mig 。
更新2
在dbeaver中以postgres用户身份登录后,我们可以看到 user__mig 具有所有必要的权限,而 user__app 对 app.property <没有任何权限/ strong>表:
这里是要重现该问题的要点:https://gist.github.com/happygrizzly/849a6a791f028ba5b191f73180ae35d1
答案 0 :(得分:1)
您应该写
ALTER DEFAULT PRIVILEGES FOR USER role__migration ...
如果省略FOR USER
子句,则仅对运行ALTER DEFAULT PRIVILEGES
的用户创建的对象授予特权。
使用以上语句,在role__migration
创建对象时授予特权。 not 不会扩展到角色role__migration
的成员。