Programing

Postgresql : 스키마가 있는지 확인 하시겠습니까?

lottogame 2020. 12. 27. 10:15
반응형

Postgresql : 스키마가 있는지 확인 하시겠습니까?


즉시 스키마를 생성, 관리 및 삭제해야합니다. 이미 존재하는 스키마를 만들려면 (조건부로 외부 수단을 통해) 지정된대로 삭제하고 다시 만들고 싶습니다. 내 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');

information_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

에서 http://www.postgresql.org/docs/9.1/static/infoschema-schemata.html (강조 내 자신의) :

보기 스키마에는 현재 활성화 된 역할이 소유 한 현재 데이터베이스의 모든 스키마가 포함됩니다 .

따라서 원래 솔루션 / 쿼리는 표준이 아니지만 Peter보다 더 신뢰할 수 있습니다.


특정 스키마 내에 개체 (테이블, sprocs, 뷰)가있는 경우 이들 중 어느 것도 작동하지 않습니다. 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가 자체적으로 만들지 않은 모든 기존 스키마를 표시합니다.

참조 URL : https://stackoverflow.com/questions/7016419/postgresql-check-if-schema-exists

반응형