我需要动态创建,管理和删除模式。如果我去创建一个已经存在的模式,我想(有条件地,通过外部手段)删除并按指定重新创建它。如何检查Postgres 9服务器上是否存在所述模式?
目前,我正在这样做:
select exists (select * from pg_catalog.pg_namespace where nspname = 'schemaname');
但我觉得可能有另一种方式......这是查询Postgres是否存在特定模式的“正确”方法吗?
答案 0 :(得分:79)
以下查询将告诉您模式是否存在。
SELECT schema_name FROM information_schema.schemata WHERE schema_name = 'name';
答案 1 :(得分:49)
如果你是一个纯粹的纯粹主义者,或者你想获得一些诅咒。我建议你使用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');
Planer的工作要简单得多:
所以你自己的解决方案是最好的。
答案 2 :(得分:16)
与寻求条件架构创建的其他人有点相关并且可能感兴趣。我发现自己在一些创建脚本中使用了这样的代码:
DO $$
BEGIN
IF NOT EXISTS(
SELECT schema_name
FROM information_schema.schemata
WHERE schema_name = 'pgcrypto'
)
THEN
EXECUTE 'CREATE SCHEMA pgcrypto';
END IF;
END
$$;
答案 3 :(得分:9)
这可能是其中一种方法。首先删除架构,然后创建它。
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
答案 4 :(得分:3)
如果要创建不存在的架构,则可以执行:
CREATE SCHEMA IF NOT EXISTS foo
来源:https://www.postgresql.org/docs/current/sql-createschema.html
答案 5 :(得分:1)
来自http://www.postgresql.org/docs/9.1/static/infoschema-schemata.html(强调我自己):
视图架构包含当前数据库中当前启用的角色所拥有的所有架构。
所以你的原始解决方案/查询比Peter的更可靠,尽管是非标准的。
答案 6 :(得分:0)
如果你在特定模式中有对象(表,sprocs,视图),那么这些将无效 - 在DROP期间它将失败......
创建&管理是容易的部分..它会让你失望..无论如何,我找不到合适的答案,所以我在这里张贴给其他人..
答案 7 :(得分:0)
这个对我有用(Postgres 9.3):
Select exists (SELECT 1 FROM information_schema.schemata where catalog_name = 'My_BD_with_UpperCase_characters_in_its_Name')
答案 8 :(得分:0)
使用
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未自行创建的所有现有模式,无论您是否有权访问模式。
答案 9 :(得分:0)
这对 PostgreSQL 有效,它将检查模式是否存在,如果不存在则创建它:
CREATE SCHEMA IF NOT EXISTS tenant;