PostgreSQL在重新创建表后忘记了授予

Sti*_*ens 3 postgresql liquibase postgresql-9.3

我们使用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;
Run Code Online (Sandbox Code Playgroud)

连接到我们自己的数据库(其中public是默认/唯一模式)后,可通过psql执行此操作。

在我们要求liquibase重新创建表之前,一切都很好,在这种情况下,它将删除所有表并再次创建它们。

之后,似乎mydbuser丢失了表上的所有授予。

据一些资源(如),我们需要改变默认的权限,所以我们服从:

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;
Run Code Online (Sandbox Code Playgroud)

但是,尽管这看起来很合乎逻辑,但它并没有改变。重新创建表后,所有赠款(甚至选择)仍然丢失。

我们做错了什么或我们还需要做些什么?

更新

\ ddp显示:默认访问权限

业主| 架构| 类型 访问权限
---------- + -------- + ---------- + ----------------- ---
postgres | 公共| 顺序| mydb = rU / postgres
postgres | 公共| 桌子| mydb = arwd / postgres

Dan*_*ité 5

如果尝试在简化的测试案例中模仿liquibase的功能,那么它就可以工作。

9.3快速演示:

1)与postgres用户从头开始创建对象:

postgres =#创建数据库dbtest;
创建数据库

postgres =#创建用户mydbuser;
创建角色

postgres =#\ c dbtest
现在,您以用户“ postgres”连接到数据库“ dbtest”。

dbtest =#在SCHEMA公共批处理中更改默认权限,将SELECT,INSERT,UPDATE,DELETE删除表到mydbuser;
更改默认权限

dbtest =#创建表foobar(id int);
创建表

2)在另一个会话中,让我们连接mydbuser并查看是否允许SELECT。

dbtest => select * from foobar;
 ID 
----
(0行)

结果:是,可以。还要注意结果\ddp

dbtest => \ ddp
             默认访问权限
  业主| 架构| 类型 访问权限    
---------- + -------- + ------- + ---------------------- -
 postgres | 公共| 桌子| mydbuser = arwd / postgres
(1列)

3)让我们postgres删除表并重新创建它:

dbtest =#drop table foobar;
滴台
dbtest =#创建表foobar(id int);
创建表

4)看看是否mydbuser仍然可以从中进行选择。

$ psql -d dbtest -U mydbuser
dbtest => select * from foobar;
 ID 
----
(0行)

结果:是,符合预期。

5)查看其他用户是否可以从中进行选择。

$ psql -d dbtest -U丹尼尔
dbtest => select * from foobar;
错误:关系foobar的权限被拒绝

结果:否,符合预期。

这不能解释什么对您不起作用,但是您可以将以上内容与liquibase发出的命令集进行比较。