2011-08-10 23 views
43

Necesito crear, administrar y soltar esquemas sobre la marcha. Si voy a crear un esquema que ya existe, quiero (condicionalmente, a través de medios externos) soltar y volver a crearlo como se especifica. ¿Cómo puedo verificar la existencia de dicho esquema en mi servidor Postgres 9?Postgresql: compruebe si existe el esquema

Actualmente, estoy haciendo esto:

select exists (select * from pg_catalog.pg_namespace where nspname = 'schemaname'); 

pero siento que es probable que haya otra manera ... es esta la forma "correcta" para consultar Postgres para la existencia de un esquema particular?

+9

Para futuros visitantes: El próximo Postgres 9.3 tendrá un 'create schema if not exists' –

Respuesta

66

La siguiente consulta le indicará si existe un esquema.

SELECT schema_name FROM information_schema.schemata WHERE schema_name = 'name'; 
+10

Gracias, esta fue una excelente respuesta. Así es como lo extendí para que funcione perfectamente para mis necesidades: 'SELECT existe (seleccione schema_name FROM information_schema.schemata WHERE schema_name = 'foo');' –

+0

¿Cómo verificar esto en C#? Si uso "ExecuteReader", muestra 1 para todas las consultas. – Shesha

+0

Usa ExecuteScalar para obtener la devolución verdadera o falsa. –

8

Este puede ser uno de los enfoques. Coloque el esquema primero y luego créelo.

IF EXISTS: 
Do not throw an error if the schema does not exist. A notice is issued in this case. 

Así,

DROP SCHEMA IF EXISTS schema_Name 
Create SCHEMA schema_Name 
+0

Sí, ¿pero decir que quería dar un paso intermedio? es decir, ¿existe SchemaXYZ? Sí: ¿contiene X? No: soltar y crear; Sí: saltar fuera de la función –

+0

Durante ese tiempo tendremos que hacer la selección existe (...). Encontré un par de enlaces con el mismo requisito. Ellos también dicen lo mismo. :) http://postgresql.1045698.n5.nabble.com/query-for-schema-existence-and-create-schema-in-jdbc-td3351491.html - PostgreSQL http://social.msdn.microsoft. com/forums/en-US/transactsql/thread/0c64f2ce-0ed8-4aee-b85c-17bb660a154a --- SQL Server – Vinay

+0

Esto es simple, breve y al grano. Buena respuesta. +1 – GeekyOmega

0

ninguno de esos funcionará si tiene objetos (tablas, procedimientos almacenados, vistas) dentro de un esquema concreto - se producirá un error durante la GOTA ...

CREATE & Manage es la parte fácil .. Es la caída que le conseguirá .. de todas formas, no pude encontrar una respuesta adecuada, por lo que he publicado aquí por otros ..

VER ENLACE aQUÍ:http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/4753d1b8-f547-44c6-b205-aa2dc22606ba/#6eb8238a-305e-40d5-858e-0fbd70454810

+2

Esto no es exacto para Postgres. Su respuesta se refiere a las restricciones de TransactSQL, no de PostgreSQL. –

14

Algo relacionado y quizás de interés para otros que buscan la creación de esquemas condicional. Me encontré utilizando código como esto en algunos de mis scripts de creación:

DO $$ 
BEGIN 

    IF NOT EXISTS(
     SELECT schema_name 
      FROM information_schema.schemata 
      WHERE schema_name = 'pgcrypto' 
    ) 
    THEN 
     EXECUTE 'CREATE SCHEMA pgcrypto'; 
    END IF; 

END 
$$; 
+0

¡Es la mejor solución de todas! :-) – nagylzs

37

Si usted es un purista, total o desea obtener algunos milisecs. Te recomiendo que hagas uso del catálogo del sistema nativo postgres. Uno puede evitar bucle anidado continuación, que es causada por llamar pg_catalog de todos modos ...

SELECT EXISTS(SELECT 1 FROM information_schema.schemata 
       WHERE schema_name = 'name'); 

querying information_schema

Si la consulta directamente pg_namespace:

SELECT EXISTS(SELECT 1 FROM pg_namespace WHERE nspname = 'name'); 

trabajo de Planer es mucho más simple:

enter image description here

Así que su propia solución fue la mejor.

+2

+1 para usar diagramas –

0

Éste trabajó para mí (Postgres 9.3):

Select exists (SELECT 1 FROM information_schema.schemata where catalog_name = 'My_BD_with_UpperCase_characters_in_its_Name') 
0

Uso

SELECT EXISTS (SELECT 1 FROM pg_catalog.pg_namespace WHERE nspowner <> 1 AND nspname = 'schemaname'); 

Si marca https://www.postgresql.org/docs/current/static/infoschema-schemata.html, se ve

La vista esquemas contiene todos los esquemas de la base de datos actual que el usuario actual tiene acceso a (a través de bei ng el propietario o tener algún privilegio).

Esto significa que la consulta en respuesta aceptada utilizando information_schema.schemata no muestra esquemas que el usuario actual no es el propietario de o no tiene el privilegio de USAGE.

SELECT 1 
FROM pg_catalog.pg_namespace 
WHERE nspowner <> 1 -- ignore tables made by postgres itself 
AND nspname = 'schemaname'; 

es más completo y mostrará todos los esquemas existentes que postgres no hacerse independientemente de si tiene o no acceso al esquema.