Name

Populate_Geometry_Columns — Garantisce che le colonne di tipo geometrico siano definite con dei modificatori di tipo o abbiano dei vincoli spaziali appropriati.

Synopsis

text Populate_Geometry_Columns(boolean use_typmod=true);

int Populate_Geometry_Columns(oid relation_oid, boolean use_typmod=true);

Descrizione

Si accerta che le colonne geometry siano definite con typemod oppure abbiano gli appropriati vincoli spaziali e conseguentemente siano correttamente registrate nella vista geometry_columns. Per default la funzione converte tutte le colonne geometry definite senza typemod in geometry con typemod.

Per retrocompatibilita' e per necessita' spaziali come l'ereditarieta' tabellare, in cui ogni tabella figlia puo' avere tipi geometrici differenti, il vecchio comportamento basato sui vincoli e' ancora sopportato. Se ti serve il vecchio comportamento puoi passare l'argomento opzionale use_typmod=false. In questo modo la colonna geometrica verra' creata senza modificatore di tipo ma avra' 3 vincoli definiti. In particolare questo vuol dire che ogni colonna geometrica appartenente ad una tabella avra' al meno tre vincoli:

  • enforce_dims_geom - assicura che ogni geometria abbia la stessa dimensione (vedere ST_NDims)

  • enforce_geotype_the_geom - assicura che tutte le geometrie sono dello stesso tipo (vedi GeometryType)

  • enforce_srid_the_geom - - assicura che tutte le geometrie hanno la stessa proiezione (vedi ST_SRID)

Se alla funzione viene passato l' oid di una tabella, questa cerca di determinare srid, dimensione e tipo della geometria di tutte le colonne geometry della tabella, aggiungendo i vincoli se necessario. In caso di successo, una riga viene inserita nella tabella geometry_columns, altrimenti viene lanciata un'eccezione con un messaggio che descrive il problema.

Se alla funzione viene passato l'oid di una vista, questa cerca di determinare srid, dimensione e tipo della geometria di tutte le colonne geometry della vista, inserendo le appropriate righe nella tabella geometry_columns. I vincoli spaziali non vengono controllati né definiti.

La variante senza parametri è un semplice wrapper per la variante parametrizzata, che prima svuota e poi riempie la tabella geometry_columns per ogni vista e tabella spaziale nel database, aggiungendo gli appropriate vincoli spaziali. La funzione ritorna un sommario con il numero delle colonne geometry trovate e di quelle inserite in geometry_columns. La versione parametrizzata ritorna semplicemente il numero di righe inserite nella tabella geometry_columns.

Disponibilità: 1.4.0

Cambiamento nella versione 2.0.0: Per default la funzione utilizza ora type modifier invece di controllare i vincoli spaziali. il meccanismo con i vincoli può essere comunque attivato passando il parametro use_typmod e settandolo come false.

Miglioramento nelle version 2.0.0: Il parametro opzionale use_typmod è stato introdotto per permettere di controllare se le colonne devono essere create con typmodifier oppure con i vincoli spaziali.

Esempi

CREATE TABLE public.myspatial_table(gid serial, geom geometry);
INSERT INTO myspatial_table(geom) VALUES(ST_GeomFromText('LINESTRING(1 2, 3 4)',4326) );
-- This will now use typ modifiers.  For this to work, there must exist data
SELECT Populate_Geometry_Columns('public.myspatial_table'::regclass);

populate_geometry_columns
--------------------------
                        1


\d myspatial_table

                                   Table "public.myspatial_table"
 Column |           Type            |                           Modifiers
--------+---------------------------+---------------------------------------------------------------
 gid    | integer                   | not null default nextval('myspatial_table_gid_seq'::regclass)
 geom   | geometry(LineString,4326) |
-- This will change the geometry columns to use constraints if they are not typmod or have constraints already.
--For this to work, there must exist data
CREATE TABLE public.myspatial_table_cs(gid serial, geom geometry);
INSERT INTO myspatial_table_cs(geom) VALUES(ST_GeomFromText('LINESTRING(1 2, 3 4)',4326) );
SELECT Populate_Geometry_Columns('public.myspatial_table_cs'::regclass, false);
populate_geometry_columns
--------------------------
                        1
\d myspatial_table_cs

                          Table "public.myspatial_table_cs"
 Column |   Type   |                            Modifiers
--------+----------+------------------------------------------------------------------
 gid    | integer  | not null default nextval('myspatial_table_cs_gid_seq'::regclass)
 geom   | geometry |
Check constraints:
    "enforce_dims_geom" CHECK (st_ndims(geom) = 2)
    "enforce_geotype_geom" CHECK (geometrytype(geom) = 'LINESTRING'::text OR geom IS NULL)
    "enforce_srid_geom" CHECK (st_srid(geom) = 4326)