7

我们使用 liquibase 来管理和执行我们的数据库更改。在我们的 DEV 环境中(尤其是在本地机器上),我们经常重新创建表以保持清白。我们刚刚从 MySQL 迁移到 Postgres,并面临与这些表重新创建相关的问题。

最初,我们已授予我们的 DB 用户:

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似乎失去了对表的所有授权。

根据几个资源(像这样)我们需要改变默认权限,所以我们服从:

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

4

1 回答 1

7

如果试图在简化的测试用例中模仿 liquibase 所做的事情,它就可以工作。

9.3 的快速演示:

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

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

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

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

dbtest=#ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT,INSERT,UPDATE,DELETE ON TABLES TO mydbuser;
更改默认权限

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

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

dbtest=> 从 foobar 中选择 *;
 ID
----
(0 行)

结果:是的,这是允许的。注意结果\ddp

dbtest=> \ddp
             默认访问权限
  所有者 | 架构 | 类型 | 访问权限    
----------+--------+--------+---------- --
 后勤 | 公共 | 表| mydbuser=arwd/postgres
(1 行)

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

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

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

$ psql -d dbtest -U mydbuser
dbtest=> 从 foobar 中选择 *;
 ID
----
(0 行)

结果:是的,正如预期的那样。

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

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

结果:不,正如预期的那样。

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

于 2013-09-15T17:41:18.287 回答