Ответ 1
Следующий запрос скажет вам, существует ли схема.
SELECT schema_name FROM information_schema.schemata WHERE schema_name = 'name';
Мне нужно создавать, управлять и удалять схемы на лету. Если я иду, чтобы создать существующую схему, я хочу (условно, через внешние средства) отбросить и воссоздать ее, как указано. Как я могу проверить наличие указанной схемы на моем сервере Postgres 9?
В настоящее время я делаю это:
select exists (select * from pg_catalog.pg_namespace where nspname = 'schemaname');
но я чувствую, что, вероятно, есть другой способ... это "правильный" способ запросить Postgres для существования конкретной схемы?
Следующий запрос скажет вам, существует ли схема.
SELECT schema_name FROM information_schema.schemata WHERE schema_name = 'name';
Если вы полный пурист или хотите получить миллисекунды. Я рекомендую вам использовать собственный системный каталог postgres. Можно избежать вложенного цикла, вызванного вызовом pg_catalog в любом случае...
SELECT EXISTS(SELECT 1 FROM information_schema.schemata
WHERE schema_name = 'name');
Если вы напрямую запрашиваете pg_namespace:
SELECT EXISTS(SELECT 1 FROM pg_namespace WHERE nspname = 'name');
Работа на пулемете намного проще:
Итак, ваше собственное решение было лучшим.
Несколько связанный и, возможно, интересный для других, ищущих создание условной схемы. Я обнаружил, что использую такой код в некоторых своих сценариях создания:
DO $$
BEGIN
IF NOT EXISTS(
SELECT schema_name
FROM information_schema.schemata
WHERE schema_name = 'pgcrypto'
)
THEN
EXECUTE 'CREATE SCHEMA pgcrypto';
END IF;
END
$$;
Это может быть один из подходов. Сначала снимите схему, а затем создайте ее.
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
Из http://www.postgresql.org/docs/9.1/static/infoschema-schemata.html (выделение мое):
Схемы представления содержат все схемы в текущей базе данных , которые принадлежат роли, включенной в данный момент.
Итак, ваше оригинальное решение/запрос более надежное, чем у Peter's, хотя и нестандартное.
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
Это работало для меня (Postgres 9.3):
Select exists (SELECT 1 FROM information_schema.schemata where catalog_name = 'My_BD_with_UpperCase_characters_in_its_Name')
Использование
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 не выполняли независимо от того, имеете ли вы доступ к схеме.