Подтвердить что ты не робот

Postgresql: Проверьте, существует ли схема?

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

Если вы полный пурист или хотите получить миллисекунды. Я рекомендую вам использовать собственный системный каталог 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');

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

enter image description here

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

Ответ 3

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

DO $$
BEGIN

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

END
$$;

Ответ 4

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

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

Ответ 5

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

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

Итак, ваше оригинальное решение/запрос более надежное, чем у Peter's, хотя и нестандартное.

Ответ 6

NONE из них будут работать, если у вас есть объекты (таблицы, sprocs, views) в рамках конкретной схемы - IT WILL FAIL во время DROP...

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

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

Ответ 7

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

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

Ответ 8

Использование

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 не показывает схемы, что текущий пользователь не является владельцем или не имеет привилегии USAGE.

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

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