Postgresql在重新创建表后忘记授权

时间:2013-09-14 18:43:05

标签: 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;

这是在连接到我们自己的数据库之后通过 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的

1 个答案:

答案 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发出的命令集进行比较。