はい、完全に可能です。
1。通常、 UPDATE
は許可されません A
へ
私は特権を持って操作します:
REVOKE ALL ON TABLE A FROM public; -- and from anybody else who might have it
そのため、 postgres
などのスーパーユーザーが残ります これらの低い制限を無視する人。 A
のトリガー関数内でそれらをキャッチします pg_has_role()コード>
:
IF pg_has_role('postgres', 'member') THEN
RETURN NULL;
END IF;
postgres
の場所 実際のスーパーユーザーです。注:他のスーパーユーザーも含め、すべての役割のメンバーであるため、これは他のスーパーユーザーもキャッチします。
同様の方法で非スーパーユーザーを捕まえることができます( REVOKE
の代わりに) アプローチ)。
2。 UPDATE
を許可する デーモンの役割の場合
A
の更新を許可する非ログインロールを作成します :
CREATE ROLE a_update NOLOGIN;
-- GRANT USAGE ON SCHEMA xyz TO a_update; -- may be needed, too
GRANT UPDATE ON TABLE A TO a_update;
テーブルB
にトリガー関数を作成します およびC
、所有 このデーモンの役割とSECURITYDEFINER
。詳細:
A
のトリガー関数に追加します :
IF pg_has_role('postgres', 'member') THEN
RETURN NULL;
ELSIF pg_has_role('a_update', 'member') THEN
RETURN NEW;
END IF;
単純な1:1の依存関係の場合は、 ON UPDATE CASCADE
を使用した外部キー制約(追加)
。