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;

これは、独自の DB に接続した後、 psqlを介して実行されます (public がデフォルト/唯一のスキーマです)。

liquibase にテーブルを再作成するように依頼するまでは、すべて問題ありません。この場合、すべてのテーブルが削除され、再度作成されます。

その後、myduserはテーブルに対する権限をすべて失ったようです。

いくつかのリソース (このような) によると、デフォルトの権限を変更する必要があるため、以下に従います。

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 の表示: デフォルトのアクセス権限

所有者 | スキーマ | タイプ | アクセス権
----------+--------+----------+----------------- ---
ポストグル | 公開 | シーケンス | mydb=rU/postgres
ポストグル | 公開 | テーブル | mydb=arwd/postgres

4

1 に答える 1

7

単純化されたテスト ケースで liquibase が行っていることを模倣しようとすると、うまくいきます。

9.3 のクイック デモ:

1) ユーザーと一緒にオブジェクトを最初から作成しpostgresます。

postgres=# データベースの作成 dbtest;
データベースの作成

postgres=# ユーザー mydbuser を作成します。
役割を作成

postgres=# \c dbtest
これで、ユーザー「postgres」としてデータベース「dbtest」に接続されました。

dbtest=# スキーマ内のデフォルト権限を変更 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行)

postgres3)テーブルを削除して再作成しましょう:

dbtest=# テーブル foobar をドロップします。
ドロップテーブル
dbtest=# テーブルを作成します foobar(id int);
テーブルを作成

4)mydbuserまだ SELECT できるかどうかを確認します。

$ psql -d dbtest -U mydbuser
dbtest=> foobar から * を選択します。
 ID
----
(0行)

結果:はい、予想通り。

5) 別のユーザーがそこから選択できるかどうかを確認します。

$ psql -d dbtest -U ダニエル
dbtest=> foobar から * を選択します。
エラー: リレーション foobar の許可が拒否されました

結果: いいえ、予想どおりです。

これは何がうまくいかないのかを説明するものではありませんが、上記のコマンドを liquibase が発行する一連のコマンドと比較することができます。

于 2013-09-15T17:41:18.287 に答える