Postgresql: проверить, существует ли схема? - PullRequest
54 голосов
/ 10 августа 2011

Мне нужно создавать, управлять и удалять схемы на лету.Если я собираюсь создать схему, которая уже существует, я хочу (условно, с помощью внешних средств) удалить и заново создать ее, как указано.Как я могу проверить наличие указанной схемы на моем сервере Postgres 9?

В настоящее время я делаю это:

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

, но я чувствую, что, возможно, есть другой способ ...Является ли это «правильным» способом запроса Postgres для существования конкретной схемы?

Ответы [ 8 ]

80 голосов
/ 11 августа 2011

Следующий запрос скажет вам, существует ли схема.

SELECT schema_name FROM information_schema.schemata WHERE schema_name = 'name';
49 голосов
/ 14 декабря 2012

Если вы абсолютный пурист или хотите получить милисек. Я рекомендую вам использовать системный каталог postgres. Тогда можно избежать вложенного цикла, который все равно вызывается вызовом pg_catalog ...

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

querying information_schema

Если вы запрашиваете pg_namespace напрямую:

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

Работа Planer намного проще:

enter image description here

Так что ваше собственное решение было лучшим .

16 голосов
/ 01 декабря 2012

В некоторой степени связан и, возможно, представляет интерес для тех, кто ищет создание условной схемы Я обнаружил, что использую такой код в некоторых моих сценариях создания:

DO $$
BEGIN

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

END
$$;
9 голосов
/ 10 августа 2011

Это может быть один из подходов.Сначала удалите схему, а затем создайте ее.

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

Итак,

DROP SCHEMA IF EXISTS schema_Name
Create SCHEMA schema_Name
1 голос
/ 31 июля 2012

От http://www.postgresql.org/docs/9.1/static/infoschema-schemata.html (выделение мое):

Схемы представлений содержат все схемы в текущей базе данных , которые принадлежат текущей включенной роли .

Таким образом, ваше оригинальное решение / запрос более надежно, чем решение Питера, хотя и нестандартное.

0 голосов
/ 27 июня 2016

Использовать

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

Если вы установите https://www.postgresql.org/docs/current/static/infoschema-schemata.html,, вы увидите

Схемы представления содержат все схемы в текущей базе данных , которые текущий пользовательимеет доступ к (будучи владельцем или обладателем каких-либо привилегий).

Это означает, что запрос в принятом ответе с использованием information_schema.schemata не показывает схемы, которые не использует текущий пользователь 't владелец или не имеет привилегии USAGE.

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

является более полным и покажет все существующие схемы, которые postgres не создал сам, независимо от того, есть ли у вас доступ к нимсхема.

0 голосов
/ 11 марта 2014

Этот работал для меня (Postgres 9.3):

Select exists (SELECT 1 FROM information_schema.schemata where catalog_name = 'My_BD_with_UpperCase_characters_in_its_Name')
0 голосов
/ 30 января 2012

Ни один из них не сработает, если у вас есть объекты (таблицы, sprocs, представления) в определенной схеме - ЭТО НЕ ПРОЙДЕТ во время DROP ...

CREATE & MANAGE - простая часть. Это падениеэто поможет вам .. В любом случае, я не смог найти подходящий ответ, поэтому я написал здесь для других ..

СМОТРИТЕ ССЫЛКУ ЗДЕСЬ: http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/4753d1b8-f547-44c6-b205-aa2dc22606ba/#6eb8238a-305e-40d5-858e-0fbd70454810

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...