👓

【redshift】テーブル権限確認と、viewとテーブルの依存関係確認

2021/08/03に公開

概要

redsihftにて以下を実現するためのクエリを書いてみます。

  • redshiftでテーブルの権限の確認
  • viewとテーブルの依存関係を確認

権限確認

任意のスキーマ配下に存在するテーブルの権限情報を出力します。
誰が作成したテーブルでどんな権限が付与されているかを確認したいときに利用します。

SELECT
  use.usename as subject,   /** 任意のスキーマを指定 */
  nsp.nspname as namespace, /** スキーマ名 */
  c.relname as item,        /** テーブル名 */
  c.relkind as type,        /** テーブルタイプ(view、realtable) */
  use2.usename as owner,    /** 作成者 */
  c.relacl                  /** 権限一覧 */
FROM
  pg_user use
  cross join pg_class c
  left join pg_namespace nsp
      on c.relnamespace = nsp.oid
  left join pg_user use2
      on c.relowner = use2.usesysid
WHERE
  c.relowner = use.usesysid
  and nsp.nspname NOT IN ('pg_catalog', 'pg_toast', 'information_schema')
  and nsp.nspname in('public','staging','work') /** 任意のスキーマを指定 */
  and type in('r','v')
ORDER BY
  subject,namespace,item;

依存関係確認

任意のテーブルと依存関係にあるviewを確認します。
テーブルを削除したいのに、
viewによってそのテーブルが参照されているために削除できない場合などに
参照先としてどんなviewが存在するかを確認するために利用します。

select distinct 
  base.oid as tbloid,                                  /** table id */
  name.nspname as schemaname,                  /** スキーマ名 */
  base.relname as tblname,                           /** テーブル名 */
  ref_name.nspname as refbyschemaname,    /** 参照先スキーマ名 */
  ref_base.relname as refbyname,                /** 参照先view名 */
  ref_base.oid as viewoid                              /** view id */
from
  pg_catalog.pg_class base
    join pg_catalog.pg_depend depend
        on base.relfilenode = depend.refobjid
    join pg_catalog.pg_depend ref_depend
        on depend.objid = ref_depend.objid
    join pg_catalog.pg_class ref_base
        on ref_depend.refobjid = ref_base.relfilenode
    left outer join pg_namespace name
        on base.relnamespace = name.oid
    left outer join pg_namespace ref_name
        on ref_base.relnamespace = ref_name.oid
where
  ref_depend.deptype = 'i'::"char"
  and ref_base.relkind = 'v'::"char"
  and tblname = '★★テーブル名★★';

Discussion