PostgreSQL DCL(GRANT、REVOKE)

GRANT

https://www.postgresql.jp/document/11/html/sql-grant.html

  • GRANT { アクセス権の種類(SELECTなど) } ON [オブジェクト種別(TABLEの場合は省略可)] オブジェクト名 TO ユーザ名(またはロール名) [WITH GRANT OPTION];
    • アクセス権の種類
      • SELECTとCOPY TOの実行を許可する(SELECT)
      • INSERTとCOPY FROMの実行を許可する(INSERT)
      • UPDATEの実行を許可する(UPDATE)
      • DELETEの実行を許可する(DELETE)
      • TRUNCATEの実行(テーブルの全データを高速で削除)を許可する(TRUNCATE)
      • 外部キー制約を作成することを許可する(REFERENCES)
      • トリガーの作成を許可する(TRIGGER)
      • データベースへの接続を許可する(CONNECT)
      • データベースに対するスキーマの作成を許可する(CREATE)
      • スキーマに対するオブジェクトの作成を許可する(CREATE)
    • WITH GRANT OPTION オプションが指定された場合、他のユーザにその権限を与えることができる。
  • GRANT ロール名 TO ユーザ名;

ユーザ名としてpublicを使うと、全ユーザに対して権限の付与(あるいはpublicに対して付与した権限の剥奪)を行うことができる。
ある個別ユーザのあるオブジェクトの権限を剥奪しても、publicユーザにあるオブジェクトの権限があれば、ある個別ユーザはあるオブジェクトを操作可能になる。
GRANTやREVOKEによるアクセス権限は、各データベース内にある。
スーパーユーザは特殊なユーザで、アクセス権限がなくても、テーブルにアクセスすることができる。
SELECTについては明示的なSELECT文を実行する場合だけでなく、SQLのWHERE句などで参照される場合にも必要になる。
ロールに権限を付与し、そのロールをユーザに付与した場合、その後で ロール に別の権限を追加で付与すれば、ユーザ にもその権限が自動的に付与される。
(権限のコピーではなく、参照を作成している?)

REVOKE

https://www.postgresql.jp/document/11/html/sql-revoke.html

  • REVOKE 権限 ON テーブル名 FROM {ユーザ名 | PUBLIC};