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');
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는 쉬운 부분입니다 .. 당신을 얻을 수있는 드롭입니다 .. 어쨌든 적절한 답을 찾지 못해서 다른 사람들을 위해 여기에 게시했습니다 ..
이것은 나를 위해 일했습니다 (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
'Programing' 카테고리의 다른 글
NSURLConnection 대리자 메서드가 호출되지 않습니다. (0) | 2020.12.27 |
---|---|
웹 배포 작업이 실패했습니다. (0) | 2020.12.27 |
기존 디렉토리를 Eclipse로 가져 오는 방법은 무엇입니까? (0) | 2020.12.27 |
루비 문자 길이 확인 (0) | 2020.12.27 |
클래스의 std :: thread 호출 메소드 (0) | 2020.12.27 |