gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:41:44 25 4
gpt4 key购买 nike

我们使用 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 显示: 默认访问权限

Owner | Schema | Type | Access privileges
----------+--------+----------+--------------------
postgres | public | sequence | mydb=rU/postgres
postgres | public | table | mydb=arwd/postgres

最佳答案

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

9.3 快速演示:

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

postgres=# create database dbtest;CREATE DATABASEpostgres=# create user mydbuser;CREATE ROLEpostgres=# \c dbtestYou 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 PRIVILEGESdbtest=# create table foobar(id int);CREATE TABLE

2) 在另一个 session 中,让我们连接 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 TABLEdbtest=# create table foobar(id int);CREATE TABLE

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

$ psql -d dbtest -U mydbuserdbtest=> select * from foobar; id ----(0 rows)

结果:是的,符合预期。

5) 查看另一个用户是否可以从中选择。

$ psql -d dbtest -U danieldbtest=> select * from foobar;ERROR:  permission denied for relation foobar

结果:没有,如预期。

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

关于Postgresql 在重新创建表后忘记了授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18805183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com