簡體   English   中英

Postgresql:檢查架構是否存在?

[英]Postgresql: Check if Schema Exists?

我需要即時創建、管理和刪除模式。 如果我 go 創建一個已經存在的模式,我想(有條件地,通過外部方式)刪除並按照指定重新創建它。 如何檢查我的 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');

查詢信息_schema

如果您直接查詢 pg_namespace:

SELECT EXISTS(SELECT 1 FROM pg_namespace WHERE nspname = 'name');

Planer 的工作要簡單得多:

在此處輸入圖像描述

所以你自己的解決方案是最好的

與尋找條件模式創建的其他人有些相關並且可能感興趣。 我發現自己在一些創建腳本中使用了這樣的代碼:

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

如果你想創建一個不存在的模式,你可以執行:

CREATE SCHEMA IF NOT EXISTS foo

資料來源: https://www.postgresql.org/docs/current/sql-createschema.html

來自http://www.postgresql.org/docs/9.1/static/infoschema-schemata.html (強調我自己的):

視圖模式包含當前數據庫中由當前啟用的角色擁有的所有模式。

因此,您的原始解決方案/查詢比彼得的更可靠,盡管是非標准的。

利用

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 自己沒有創建的所有現有模式,無論您是否有權訪問該模式。

這個對我有用(Postgres 9.3):

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

這對 PostgreSQL 有效,它將檢查模式是否存在,如果不存在,則創建它:

CREATE SCHEMA IF NOT EXISTS tenant;

如果您在特定模式中有對象(表、存儲過程、視圖),那么這些都不會起作用 - 在 DROP 期間它會失敗......

CREATE & MANAGE 是最簡單的部分.. 它會讓你失望.. 無論如何,我找不到合適的答案,所以我在這里發布給其他人..

此處查看鏈接: http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/4753d1b8-f547-44c6-b205-aa2dc22606ba/#6eb8238a-305e-40d5-8458e-0fbd704

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM