我们使用liquibase来管理和执行我们的数据库更改。在我们的DEV环境中(特别是在本地机器上),我们经常重新创建表格以获得干净的平台。 我们刚刚从MySQL迁移到Postgres,并且面临与这些表重新创建相关的问题。
最初我们已经为我们的数据库用户授予了:
GRANT SELECT,INSERT,UPDATE,DELETE ON ALL TABLES IN SCHEMA public TO mydbuser;
GRANT SELECT, USAGE ON ALL SEQUENCES IN SCHEMA public TO mydbuser;
这是在连接到我们自己的数据库之后通过 psql 执行的(其中public是默认/唯一模式)。
一切都很好,直到我们要求liquibase重新创建表格,在这种情况下,它会删除所有表格并再次创建它们。
之后,似乎 mydbuser 已经失去了桌面上的所有资助。
根据多个资源(如this),我们需要更改默认权限,因此我们遵守:
GRANT SELECT,INSERT,UPDATE,DELETE ON ALL TABLES IN SCHEMA public TO mydbuser;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT,INSERT,UPDATE,DELETE ON TABLES TO mydbuser;
GRANT SELECT, USAGE ON ALL SEQUENCES IN SCHEMA public TO mydbuser;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, USAGE ON SEQUENCES TO mydbuser;
然而,尽管这似乎很合乎逻辑但它没有改变。重新创建表后,所有授权(甚至选择)仍然丢失。
我们做错了什么或我们还需要做什么?
更新
\ ddp显示: 默认访问权限
所有者|架构|输入|访问权限
---------- + -------- + ---------- + ------------------- -
postgres |公众|序列| MYDB = RU / postgres的
postgres |公众|表| MYDB = arwd / postgres的
答案 0 :(得分:5)
如果试图模仿liquibase在一个简化的测试用例中做了什么,它就可以了。
快速演示9.3:
1)使用postgres
用户从头开始创建对象:
postgres=# create database dbtest; CREATE DATABASE postgres=# create user mydbuser; CREATE ROLE postgres=# \c dbtest You are now connected to database "dbtest" as user "postgres". dbtest=# ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT,INSERT,UPDATE,DELETE ON TABLES TO mydbuser; ALTER DEFAULT PRIVILEGES dbtest=# create table foobar(id int); CREATE TABLE
2)在另一个会话中,让我们连接mydbuser
并查看是否允许SELECT。
dbtest=> select * from foobar; id ---- (0 rows)
结果:是的,这是允许的。请注意\ddp
的结果:
dbtest=> \ddp Default access privileges Owner | Schema | Type | Access privileges ----------+--------+-------+------------------------ postgres | public | table | mydbuser=arwd/postgres (1 row)
3)让我们postgres
删除表并重新创建它:
dbtest=# drop table foobar; DROP TABLE dbtest=# create table foobar(id int); CREATE TABLE
4)看看mydbuser
是否仍然可以从中进行选择。
$ psql -d dbtest -U mydbuser dbtest=> select * from foobar; id ---- (0 rows)
结果:是的,正如所料。
5)查看其他用户是否可以从中进行选择。
$ psql -d dbtest -U daniel dbtest=> select * from foobar; ERROR: permission denied for relation foobar
结果:不,如预期的那样。
这并不能解释什么对您不起作用,但您可以将上述内容与liquibase发出的命令集进行比较。