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'); 

查询information_schema

如果直接查询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没有自己做,无论你是否有权访问模式。