La vue matérialisée n'apparaît pas dans la vue Geometry_Columns

12

J'ai défini une vue matérialisée dans une base de données compatible PostGIS 2.1 exécutant PostgreSQL 9.3.1:

CREATE MATERIALIZED VIEW canvec_data.contours_m AS 
 SELECT
    contours_original.ogc_fid, 
    contours_original.elevation::integer AS elevation_orig, 
    CASE
        WHEN "substring"(contours_original.code::text, 1, 3) = '257'::text THEN round(contours_original.elevation::double precision * 0.3048::double precision)
        ELSE contours_original.elevation::double precision
    END AS elevation_m, 
    contours_original.wkb_geometry::geometry(Linestring,3578)
 FROM canvec_data.contours_original

Je m'étais attendu, peut-être à tort, à ce que cette entité résultante (une table?) Soit répertoriée dans la public.geometry_columnsvue, et donc correctement interprétée par un logiciel de visualisation SIG tel que QGIS.

La vue matérialisée n'apparaît pas dans la public.geometry_columnsvue.

Qu'est-ce que je fais mal?

Merci!

Joebocop
la source

Réponses:

16

Vous ne faites rien de mal, vous avez découvert un trou dans notre prise en charge de la nouvelle fonctionnalité de vue matérialisée de PostgreSQL 9.3. J'ai corrigé toutes les branches pertinentes, et vous pouvez mettre à jour vous-même votre définition de geometry_columns (voir les références de changement dans ce ticket http://trac.osgeo.org/postgis/ticket/2511 )

En fait, voici quelque chose que vous pouvez simplement coller dans la fenêtre SQL:

CREATE OR REPLACE VIEW geometry_columns AS 
  SELECT current_database()::varchar(256) AS f_table_catalog, 
    n.nspname::varchar(256) AS f_table_schema, 
    c.relname::varchar(256) AS f_table_name, 
    a.attname::varchar(256) AS f_geometry_column, 
    COALESCE(NULLIF(postgis_typmod_dims(a.atttypmod),2),
             postgis_constraint_dims(n.nspname, c.relname, a.attname),
             2) AS coord_dimension, 
    COALESCE(NULLIF(postgis_typmod_srid(a.atttypmod),0),
             postgis_constraint_srid(n.nspname, c.relname, a.attname),
             0) AS srid, 
    -- force to be uppercase with no ZM so is backwards compatible
    -- with old geometry_columns
    replace(
      replace(
        COALESCE(
          NULLIF(upper(postgis_typmod_type(a.atttypmod)::text), 'GEOMETRY'),
          postgis_constraint_type(n.nspname, c.relname, a.attname),
          'GEOMETRY'
        ), 'ZM', ''
      ), 'Z', ''
    )::varchar(30) AS type
  FROM pg_class c, pg_attribute a, pg_type t, pg_namespace n
  WHERE t.typname = 'geometry'::name 
    AND a.attisdropped = false 
    AND a.atttypid = t.oid 
    AND a.attrelid = c.oid 
    AND c.relnamespace = n.oid 
    AND (c.relkind = 'r'::"char" OR c.relkind = 'v'::"char" OR c.relkind = 'm'::"char")
    AND NOT pg_is_other_temp_schema(c.relnamespace)
    AND NOT ( n.nspname = 'public' AND c.relname = 'raster_columns' )
    AND has_table_privilege( c.oid, 'SELECT'::text );
Paul Ramsey
la source
5
Grande réponse et correction; c'est le service client ...
DEWright