2015-04-21 19 views
9

Ich versuche pg_dump (v9.3.4) von einer db und pg_restore in eine andere (v9.3.6). Ich habe mehrere materialisierte Ansichten (einige mit Indizes und einige ohne Indizes). Eine meiner materialisierten Ansichten wird als Tabelle ausgegeben (ich habe dies anhand der Ausgabe von pg_dump bestätigt). Wie kann ich es als materialisierte Ansicht ausgeben?Wie kann ich eine materialisierte Ansicht als materialisierte Ansicht und nicht als Tabelle ausgeben?

Hier ist, was ich in meinem pg_dump Ausgabe sehen:

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 (

/* ... */ 

Meine anderen MVs wie folgt aussehen:

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; 

Ich habe bestätigt, dass es ein MV ist:

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

Hier ist die MV-Definition:

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

zu exportieren * Ist * es ein MV? Was bekommst du für 'SELECT relkind FROM pg_class WHERE oid = 'public.my_mv' :: regclass'? 'm' oder' r'? In älteren Versionen von Postgres MVs wurden als Tabelle implementiert und von Hand aktualisiert, vielleicht ist dies ein Stück Vermächtnis? –

+0

Ich bekomme "m" zurück (siehe meine bearbeitete Frage). Ich nehme an, 'm' ist für materialisierte Ansicht? –

+1

Ja. 'm' ist für MV. Das ist seltsam. Ich denke, wenn Sie das Objekt mit der Standard-'CREATE MATERIALIZED VIEW'-Syntax löschen und neu erstellen, sollte die Anomalie verschwinden. –

Antwort

0

Eine materialisierte Ansicht wird "technisch" als Tabellenobjekt gespeichert. Wenn sie mit pg_dump exportiert wird, wird sie als solche behandelt. Es ist nicht möglich, mit pg_dump als MV