2017-11-01 4 views
0

私の公開スキーマ(postgresql 9.4を使用)にvw_check_spaceという名前のビューがあります。私はpostgresユーザとしてPostgresql:レコードを返さないビューの選択

select * from public.vw_check_space; 

を実行すると、私は、行のリストを取得するが、私は別のユーザーUSER1」で同じクエリを実行すると、それは何も返しません。

ビュー:

CREATE OR REPLACE VIEW public.vw_check_space AS 
WITH constants AS (
    SELECT current_setting('block_size'::text)::numeric AS bs, 
     23 AS hdr, 
     8 AS ma 
    ), no_stats AS (
    SELECT columns.table_schema, 
     columns.table_name, 
     psut.n_live_tup::numeric AS est_rows, 
     pg_table_size(psut.relid::regclass)::numeric AS table_size 
     FROM columns 
     JOIN pg_stat_user_tables psut ON columns.table_schema::name = psut.schemaname AND columns.table_name::name = psut.relname 
     LEFT JOIN pg_stats ON columns.table_schema::name = pg_stats.schemaname AND columns.table_name::name = pg_stats.tablename AND columns.column_name::name = pg_stats.attname 
     WHERE pg_stats.attname IS NULL AND (columns.table_schema::text <> ALL (ARRAY['pg_catalog'::character varying, 'information_schema'::character varying]::text[])) 
     GROUP BY columns.table_schema, columns.table_name, psut.relid, psut.n_live_tup 
    ), null_headers AS (
    SELECT constants.hdr + 1 + sum(
      CASE 
       WHEN pg_stats.null_frac <> 0::double precision THEN 1 
       ELSE 0 
      END)/8 AS nullhdr, 
     sum((1::double precision - pg_stats.null_frac) * pg_stats.avg_width::double precision) AS datawidth, 
     max(pg_stats.null_frac) AS maxfracsum, 
     pg_stats.schemaname, 
     pg_stats.tablename, 
     constants.hdr, 
     constants.ma, 
     constants.bs 
     FROM pg_stats 
     CROSS JOIN constants 
     LEFT JOIN no_stats ON pg_stats.schemaname = no_stats.table_schema::name AND pg_stats.tablename = no_stats.table_name::name 
     WHERE (pg_stats.schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND no_stats.table_name IS NULL AND (EXISTS (SELECT 1 
       FROM columns 
       WHERE pg_stats.schemaname = columns.table_schema::name AND pg_stats.tablename = columns.table_name::name)) 
     GROUP BY pg_stats.schemaname, pg_stats.tablename, constants.hdr, constants.ma, constants.bs 
    ), data_headers AS (
    SELECT null_headers.ma, 
     null_headers.bs, 
     null_headers.hdr, 
     null_headers.schemaname, 
     null_headers.tablename, 
     (null_headers.datawidth + (null_headers.hdr + null_headers.ma - 
      CASE 
       WHEN (null_headers.hdr % null_headers.ma) = 0 THEN null_headers.ma 
       ELSE null_headers.hdr % null_headers.ma 
      END)::double precision)::numeric AS datahdr, 
     null_headers.maxfracsum * (null_headers.nullhdr + null_headers.ma - 
      CASE 
       WHEN (null_headers.nullhdr % null_headers.ma::bigint) = 0 THEN null_headers.ma::bigint 
       ELSE null_headers.nullhdr % null_headers.ma::bigint 
      END)::double precision AS nullhdr2 
     FROM null_headers 
    ), table_estimates AS (
    SELECT data_headers.schemaname, 
     data_headers.tablename, 
     data_headers.bs, 
     pg_class.reltuples::numeric AS est_rows, 
     pg_class.relpages::numeric * data_headers.bs AS table_bytes, 
     ceil(pg_class.reltuples * (data_headers.datahdr::double precision + data_headers.nullhdr2 + 4::double precision + data_headers.ma::double precision - 
      CASE 
       WHEN (data_headers.datahdr % data_headers.ma::numeric) = 0::numeric THEN data_headers.ma::numeric 
       ELSE data_headers.datahdr % data_headers.ma::numeric 
      END::double precision)/(data_headers.bs - 20::numeric)::double precision) * data_headers.bs::double precision AS expected_bytes, 
     pg_class.reltoastrelid 
     FROM data_headers 
     JOIN pg_class ON data_headers.tablename = pg_class.relname 
     JOIN pg_namespace ON pg_class.relnamespace = pg_namespace.oid AND data_headers.schemaname = pg_namespace.nspname 
     WHERE pg_class.relkind = 'r'::"char" 
    ), estimates_with_toast AS (
    SELECT table_estimates.schemaname, 
     table_estimates.tablename, 
     true AS can_estimate, 
     table_estimates.est_rows, 
     table_estimates.table_bytes + COALESCE(toast.relpages, 0)::numeric * table_estimates.bs AS table_bytes, 
     table_estimates.expected_bytes + ceil(COALESCE(toast.reltuples, 0::real)/4::double precision) * table_estimates.bs::double precision AS expected_bytes 
     FROM table_estimates 
     LEFT JOIN pg_class toast ON table_estimates.reltoastrelid = toast.oid AND toast.relkind = 't'::"char" 
    ), table_estimates_plus AS (
    SELECT current_database() AS databasename, 
     estimates_with_toast.schemaname, 
     estimates_with_toast.tablename, 
     estimates_with_toast.can_estimate, 
     estimates_with_toast.est_rows, 
      CASE 
       WHEN estimates_with_toast.table_bytes > 0::numeric THEN estimates_with_toast.table_bytes 
       ELSE NULL::numeric 
      END AS table_bytes, 
      CASE 
       WHEN estimates_with_toast.expected_bytes > 0::double precision THEN estimates_with_toast.expected_bytes::numeric 
       ELSE NULL::numeric 
      END AS expected_bytes, 
      CASE 
       WHEN estimates_with_toast.expected_bytes > 0::double precision AND estimates_with_toast.table_bytes > 0::numeric AND estimates_with_toast.expected_bytes <= estimates_with_toast.table_bytes::double precision THEN (estimates_with_toast.table_bytes::double precision - estimates_with_toast.expected_bytes)::numeric 
       ELSE 0::numeric 
      END AS bloat_bytes 
     FROM estimates_with_toast 
    UNION ALL 
    SELECT current_database() AS databasename, 
     no_stats.table_schema, 
     no_stats.table_name, 
     false AS bool, 
     no_stats.est_rows, 
     no_stats.table_size, 
     NULL::numeric AS "numeric", 
     NULL::numeric AS "numeric" 
     FROM no_stats 
    ), bloat_data AS (
    SELECT current_database() AS databasename, 
     table_estimates_plus.schemaname, 
     table_estimates_plus.tablename, 
     table_estimates_plus.can_estimate, 
     table_estimates_plus.table_bytes, 
     round(table_estimates_plus.table_bytes/(1024::double precision^2::double precision)::numeric, 3) AS table_mb, 
     table_estimates_plus.expected_bytes, 
     round(table_estimates_plus.expected_bytes/(1024::double precision^2::double precision)::numeric, 3) AS expected_mb, 
     round(table_estimates_plus.bloat_bytes * 100::numeric/table_estimates_plus.table_bytes) AS pct_bloat, 
     round(table_estimates_plus.bloat_bytes/(1024::numeric^2::numeric), 2) AS mb_bloat, 
     table_estimates_plus.est_rows 
     FROM table_estimates_plus 
    ) 
SELECT bloat_data.databasename, 
bloat_data.schemaname, 
bloat_data.tablename, 
bloat_data.can_estimate, 
bloat_data.table_bytes, 
bloat_data.table_mb, 
bloat_data.expected_bytes, 
bloat_data.expected_mb, 
bloat_data.pct_bloat, 
bloat_data.mb_bloat, 
bloat_data.est_rows 
    FROM bloat_data 
    ORDER BY bloat_data.pct_bloat DESC; 

私は、データベースに接続する権限を提供し、ユーザーUSER1に使用量およびSELECT権限を付与しています。私はここで欠けている他の特権が何であるか分かりません。どんな助けもありがとう。

PS:ビューの作成時に使用している表とスキーマに対して、使用方法と選択権限を提供しました。

+1

スタートを含めるに関するすべてのビュー、= CURRENT_USER例えば '「postgresの」()'希望をお読みくださいすでに返された行はありません。また、行のセキュリティになる可能性があります。 postgresのバージョンとビューの定義から始めてください –

+0

私はpostgres 9.4を使用しており、ビューの定義を含めています – vsh9

答えて

0

https://www.postgresql.org/docs/9.4/static/view-pg-stats.html

ビューでpg_statsは もしpg_statisticカタログに格納された情報へのアクセスを提供します。このビューでは、 pg_statisticの行にのみアクセスできます。この行は、ユーザーが の読み取り権限を持っているテーブルに対応しているため、この ビューへのパブリック読み取りアクセスを許可するのが安全です。ユーザのみ テーブルが示されていることを除いてpg_stat_all_tablesと同じ

https://www.postgresql.org/docs/9.4/static/monitoring-stats.html

pg_stat_user_tables、。

ユーザーに他の所有者のテーブルの上に読んで付与した後ので、あなたはまだ...あなたはonwerそのテーブルのみにリストを切っなるpg_stat_user_tablesに参加 - ビューから除外、またはleft outer joinの代わりを使用しますかinner join

私はおよそJOIN pg_stat_user_tablesを話しているが、あなたはあなたが参加するすべてのテーブルをチェックして、あなたのクエリで、ビュー定義と

+0

ありがとうございます。私はビューがやっていることとまったく同じ働きをし、すべてが実行可能にしたpostgresユーザーとして関数を作成しました。だから今、私のユーザuser1がそれを選択すると、私は最初に見たいと思った結果を正常に見ることができます。 – vsh9

+0

はい、機能がセキュリティ定義者の場合は、そのようなトリック –

+0

が正しいことができます。私は関数のセキュリティ定義者を作ったと働いた:) – vsh9

関連する問題