Postgresql:检查模式是否存在?
我需要在运行中创build,pipe理和删除模式。 如果我去创build一个已经存在的模式,我想(有条件的,通过外部的方式)删除并重新创build它的指定。 我怎样才能检查我的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';
如果你是一个纯粹的纯粹主义者,或者你想获得一些milisecs。 我build议你使用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');
刨床的工作要简单得多:
所以你自己的解决scheme是最好的 。
与其他人寻找有条件的模式创build有些相关,也许感兴趣。 我发现自己在我的一些创build脚本中使用这样的代码:
DO $$ BEGIN IF NOT EXISTS( SELECT schema_name FROM information_schema.schemata WHERE schema_name = 'pgcrypto' ) THEN EXECUTE 'CREATE SCHEMA pgcrypto'; END IF; END $$;
这可能是其中一种方法。 首先删除模式,然后创build它。
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 (强调我自己的):
视图模式包含当前数据库中由当前启用的angular色拥有的所有模式。
所以你的原始解决scheme/查询比Peter的更可靠,尽pipe是非标准的。
如果你在一个特定的模式中有对象(表格,sprocs,视图),那么这些都不会起作用 – 在DROP期间它会失败。
创造和pipe理是很容易的部分..这是下降,将得到你..无论如何,我找不到合适的答案,所以我张贴在这里为他人..
查看链接: 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没有自己做,无论你是否有权访问模式。