2015-04-21 10 views
9

Sto tentando di pg_dump (v9.3.4) da un db e pg_restore in un altro (v9.3.6). Ho diverse visualizzazioni materializzate (alcune con indici e altre senza indici). Una delle mie visioni materializzate viene scaricata come tabella (l'ho confermata guardando l'output di pg_dump). Come posso scaricarlo come una vista materializzata?Come posso pg_dump una vista materializzata come una vista materializzata e non una tabella?

Ecco quello che vedo nella mia uscita pg_dump:

CREATE TABLE my_mv (
    /* ... */ 
); 

/* ... */ 

CREATE INDEX my_mv_col_1_idx ON my_mv USING btree (col_1); 

/* ... */ 

CREATE RULE "_RETURN" AS 
    ON SELECT TO my_mv DO INSTEAD WITH tmp_1 AS (

/* ... */ 

altri miei MV simile a questa:

CREATE MATERIALIZED VIEW my_good_mv AS 
    SELECT /* ... */ 
WITH NO DATA; 

/* ... */ 

CREATE INDEX my_good_mv_job_col_1_idx ON my_good_mv USING btree (col_1); 

/* ... */ 

REFRESH MATERIALIZED VIEW my_good_mv; 

Ho confermato questo è un MV:

xxx=# SELECT relkind FROM pg_class WHERE oid = 'public.my_mv'::regclass; 
relkind 
--------- 
m 
(1 row) 

Ecco la definizione MV:

create materialized view mv_members 
(
    id, 
    state, 
    tags, 
    primary_job_function, job_functions, 
    min_salary, 
    current_level, current_employer, desired_employment_types, desired_org_sizes, 
    years_of_pro_experience, 
    current_location, current_location_parents, desired_locations, desired_location_parents, 
    creation_date) 
as 
with wh as (
    select poach_id, employer 
    from (
    select poach_id, employer, row_number() over (partition by poach_id order by employer) as n 
    from work_histories 
    where end_year is null) t 
    where n = 1), 
tags as (
    select parent_id as poach_id, array_remove(array_agg(tag), null) as tags 
    from poach_tags 
    group by poach_id), 
jfns as (
    select poach_id, array_remove(array_agg(job_function_id), null) as job_functions 
    from poach_job_functions 
    group by poach_id), 
pjf as (
    select poach_id, job_function_id 
    from (
    select poach_id, job_function_id, row_number() over (partition by poach_id order by job_function_id) as n 
    from poach_job_functions 
    where is_primary = true) t 
    where n = 1), 
pdl as (
    select 
    p.id as poach_id, 
    case when p.desired_locations != '{}' 
     then p.desired_locations 
     else 
     case when p.mapped_desired_locations is null 
      then '{}' 
      else p.mapped_desired_locations 
     end 
    end as desired_locations 
    from poaches p), 
pdla as (
    select pdl.poach_id, unnest(l.ancestors) as ancestor 
    from pdl 
    inner join locations l on l.id = any(pdl.desired_locations)), 
min_salaries as (
    select p.id as poach_id, 
    case when min_salary_min is not null 
    then min_salary_min 
    else 
     case when min_salary_max is not null 
     then 0 
     else 
      case when current_salary_min is not null 
      then current_salary_min 
      else 
       case when current_salary_max is not null 
       then 0 
       else null 
       end 
      end 
     end 
    end as min_salary 
    from poaches p) 
select 
    p.id, 
    s.state, 
    coalesce(t.tags, '{}'), 
    pjf.job_function_id, 
    coalesce(jfns.job_functions, '{}') as job_functions, 
    min_salaries.min_salary as min_salary, 
    p.current_level, 
    wh.employer, 
    p.employment_types, 
    p.desired_org_sizes, 
    p.years_of_pro_experience, 
    p.current_location_id as current_location, 
    array_remove(array_append(cl.ancestors, p.current_location_id), null) as current_location_parents, 
    pdl.desired_locations, 
    array_remove(array_cat(array_agg(pdla.ancestor), pdl.desired_locations), null) as desired_location_parents, 
    p.creation_date 
from 
    poaches p 
    inner join entity_states s on p.id = s.entity_id and s.is_current = true 
    inner join min_salaries on p.id = min_salaries.poach_id 
    left outer join tags t on p.id = t.poach_id 
    left outer join wh on p.id = wh.poach_id 
    left outer join pjf on p.id = pjf.poach_id 
    left outer join jfns on p.id = jfns.poach_id 
    left outer join locations cl on p.current_location_id = cl.id 
    left outer join pdl on p.id = pdl.poach_id 
    left outer join pdla on p.id = pdla.poach_id 
where p.is_active = true 
group by p.id, s.state, t.tags, pjf.job_function_id, job_functions, min_salary, p.current_level, wh.employer, p.employment_types, p.desired_org_sizes, current_location, current_location_parents, pdl.desired_locations, p.creation_date; 

create index on mv_members (state); 
create index on mv_members (primary_job_function); 
create index on mv_members (job_functions); 
create index on mv_members (current_level); 
create index on mv_members (desired_employment_types); 
create index on mv_members (desired_org_sizes); 
create index on mv_members (desired_locations); 
create index on mv_members (desired_location_parents); 
create index on mv_members (creation_date); 
+1

* È * è una MV? Cosa ottieni per 'SELECT relkind FROM pg_class WHERE oid = 'public.my_mv' :: regclass'? 'm' o' r'? Nelle versioni precedenti di Postgres MVs erano implementate come tabella e aggiornate a mano, forse questo è un pezzo di eredità? –

+0

torno 'm' (vedi la mia domanda modificata). Suppongo che 'm' sia per una vista materializzata? –

+1

Sì. 'm' è per MV. È strano. Suppongo che se si rilascia e si ricrea l'oggetto con la sintassi standard 'CREATE MATERIALIZED VIEW', l'anomalia dovrebbe andare via. –

risposta

0

Una vista materializzata è "tecnicamente" memorizzata come oggetto tabella, quindi quando viene esportata con pg_dump viene trattata come tale. Non è possibile esportare usando pg_dump come MV

Problemi correlati