15 votos

Añadir funciones espaciales de PostGIS a un esquema personalizado que no sea "público" en PostgreSQL

Recientemente, he creado una base de datos PostGIS 2.0.3 en un servidor de bases de datos PostgreSQL 9.1 utilizando pgAdmin. La extensión "PostGIS" se encontró instalada en "Extensiones". Todas las funciones espaciales fueron añadidas al esquema "público". Eso está bien.

Ahora quiero almacenar todos mis datos en un nuevo esquema llamado "gc". Sin embargo, ¿cómo puedo hacer que todas las funciones espaciales se instalen en ese esquema "gc"? No hay ninguna función en el esquema. Sin embargo, cuando intenté importar/nuevo una feature class de ESRI ArcCatalog 10.1 a este esquema, ¡funcionó! La clase de característica pudo ser importada y mostrada en QGIS.

¿Alguien podría darme algún consejo o idea al respecto?

Soy nuevo en PostgreSQL y PostGIS.

0 votos

Acabo de darme cuenta: ya se ha tratado en gis.stackexchange.com/questions/43187/

0 votos

@MartinF Allí es una respuesta (incompleta) a esta pregunta en la pregunta a la que has enlazado, pero esa pregunta en realidad está pidiendo algo muy diferente.

0 votos

Esta pregunta también podría titularse "¿Instalar PostGIS en un esquema que no sea público?".

5voto

mathlove Puntos 6

Estos son los comandos de ejemplo para instalar la extensión PostGIS en un gc esquema:

CREATE SCHEMA gc;

CREATE EXTENSION postgis SCHEMA gc;

Aquí están los comandos de ejemplo para mover PostGIS y sus objetos a un nuevo esquema para la versión 2.4.4 de PostGIS en caso de que ya lo tengas instalado:

CREATE SCHEMA gc;

UPDATE pg_extension
SET extrelocatable = TRUE
WHERE extname = 'postgis';

ALTER EXTENSION postgis
SET SCHEMA gc;

ALTER EXTENSION postgis
UPDATE TO "2.4.4next";

ALTER EXTENSION postgis
UPDATE TO "2.4.4";

Esto no es estrictamente necesario; sólo es útil:

ALTER DATABASE whatever
SET search_path = public,gc;

4voto

Tekson Puntos 230

Aquí está su solución:

CREATE SCHEMA gc;

CREATE EXTENSION postgis SCHEMA gc;

Si ya has instalado la extensión postGIS en tu esquema público y quieres moverlo en gc entonces escribe el siguiente código:

UPDATE pg_extension 
  SET extrelocatable = TRUE 
    WHERE extname = 'postgis';

ALTER EXTENSION postgis 
  SET SCHEMA gc;

2voto

jumentous Puntos 31

Kenny Evitt ya ha explicado lo más importante. Sin embargo, aquí hay algo de información adicional:

Postgresql tiene bases de datos, tablespaces y esquemas, y es imposible realizar uniones de una base de datos a otra, porque están estrictamente separadas. Una base de datos puede tener más de un esquema, y es posible unir algo de un esquema a otro. Para más información, consulte la documentación:

Otra posibilidad para cargar PostGIS en su esquema gc sería la siguiente:

t=# create schema gc;
CREATE SCHEMA
t=# set search_path to gc;
SET
t=# create extension postgis;
CREATE EXTENSION

No soy un experto en Arc Catalog ni en pgadmin, pero asumo que ha ocurrido una de las siguientes tres posibilidades:

  1. Postgresql soporta tipos de datos geométricos nativamente . Pero no debes confiar en esto en Geo Contextos, porque los metadatos CRS así como la funcionalidad de transformación no se dan. Has tenido suerte y no se ha roto nada.
  2. Arc Catalog de alguna manera, después de no encontrar una extensión de PostGIS, la creó sin notificar al usuario. Para comprobarlo, podrías mirar las tablas existentes antes y después de ese paso.

En psql, puede hacer esto escribiendo:

\d
           List of Relations
 Schema |       Name        |   Type  | Owner 
--------+-------------------+---------+----------
 gc     | geography_columns | View    | postgres
 gc     | geometry_columns  | View    | postgres
 gc     | raster_columns    | View    | postgres
 gc     | raster_overviews  | View    | postgres
 gc     | spatial_ref_sys   | Table   | postgres

Si ve esto, PostGIS ha sido instalado como una extensión. La tercera posibilidad sería que ArcCatalog hace algo así:

set search_path to $all_schemas;
import to gc;

En este caso, también acabas de tener suerte. Pero tal vez, ArcCatalog hace algo más sofisticado al final...

0voto

Bill-- Puntos 1

Sólo hay que actualizar la ruta de búsqueda para incluir la pública. Por lo tanto, se ejecutaría

ALTER DATABASE buzzed_api SET search_path TO gc, publIC;

Para establecerlo sólo para la sesión actual, ejecute:

SET search_path = public,gc;

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X