A PostgreSQL데이터베이스 클러스터에는 하나 이상의 명명된 데이터베이스가 포함되어 있습니다. 역할과 기타 몇 가지 개체 유형은 전체 클러스터에서 공유됩니다. 서버에 대한 클라이언트 연결은 연결 요청에 지정된 단일 데이터베이스의 데이터에만 액세스할 수 있습니다.
클러스터 사용자는 반드시 클러스터의 모든 데이터베이스에 액세스할 수 있는 권한을 가질 필요는 없습니다. 역할 이름을 공유한다는 것은 이름이 다른 역할이 있을 수 없음을 의미합니다.조동일한 클러스터에 있는 두 개의 데이터베이스에 있습니다. 하지만 시스템은 다음을 허용하도록 구성될 수 있습니다.조일부 데이터베이스에만 액세스합니다.
데이터베이스에는 하나 이상의 이름이 포함되어 있습니다.배트맨 토토, 여기에는 테이블이 포함됩니다. 배트맨 토토에는 데이터 유형, 함수, 연산자 등 다른 종류의 명명된 개체도 포함되어 있습니다. 동일한 객체 이름을 충돌 없이 다른 배트맨 토토에서 사용할 수 있습니다. 예를 들어 둘 다배트맨 토토1그리고미배트맨 토토이름이 지정된 테이블을 포함할 수 있습니다.마이테이블. 데이터베이스와 달리 배트맨 토토는 엄격하게 분리되지 않습니다. 사용자는 권한이 있는 경우 연결된 데이터베이스의 모든 배트맨 토토에 있는 객체에 액세스할 수 있습니다.
배트맨 토토를 사용하려는 데에는 몇 가지 이유가 있습니다:
많은 사용자가 서로 간섭하지 않고 하나의 데이터베이스를 사용할 수 있도록 합니다.
데이터베이스 개체를 논리적 그룹으로 구성하여 관리하기 쉽게 만듭니다.
타사 응용 프로그램은 다른 개체의 이름과 충돌하지 않도록 별도의 배트맨 토토에 넣을 수 있습니다.
배트맨 토토는 중첩될 수 없다는 점을 제외하면 운영 체제 수준의 디렉토리와 유사합니다.
배트맨 토토를 생성하려면 다음을 사용하십시오.배트맨 토토 생성명령. 배트맨 토토에 원하는 이름을 지정하십시오. 예를 들면:
배트맨 토토 myschema 생성;
배트맨 토토에서 개체를 생성하거나 액세스하려면 다음을 작성하십시오.정식 이름점으로 구분된 배트맨 토토 이름과 테이블 이름으로 구성됨:
배트맨 토토.테이블
이것은 다음 장에서 설명하는 테이블 수정 명령 및 데이터 액세스 명령을 포함하여 테이블 이름이 예상되는 모든 곳에서 작동합니다. (간결하게 하기 위해 테이블에 대해서만 이야기하지만 유형 및 함수와 같은 다른 종류의 명명된 개체에도 동일한 아이디어가 적용됩니다.)
사실, 훨씬 더 일반적인 구문
데이터베이스.배트맨 토토.테이블
또한 사용할 수 있지만 현재 이는 SQL 표준을 형식적으로 준수하기 위한 것입니다. 데이터베이스 이름을 작성하는 경우 연결된 데이터베이스와 동일해야 합니다.
따라서 새 배트맨 토토에 테이블을 생성하려면 다음을 사용하십시오:
테이블 생성 myschema.mytable( ... );
배트맨 토토가 비어 있는 경우(그 안의 모든 개체가 삭제된 경우) 배트맨 토토를 삭제하려면 다음을 사용하세요:
DROP SCHEMA myschema;
포함된 모든 객체를 포함하는 배트맨 토토를 삭제하려면 다음을 사용하십시오:
DROP SCHEMA myschema CASCADE;
참조PostgreSQL : 문서 : 15 : 5.14.토토 꽁 머니 추적이것 뒤에 있는 일반적인 메커니즘에 대한 설명입니다.
종종 다른 사람이 소유한 배트맨 토토를 생성하고 싶을 것입니다(이는 사용자의 활동을 잘 정의된 네임스페이스로 제한하는 방법 중 하나이기 때문입니다). 이에 대한 구문은 다음과 같습니다.
배트맨 토토 생성schema_name승인사용자_이름;
배트맨 토토 이름을 생략할 수도 있습니다. 이 경우 배트맨 토토 이름은 사용자 이름과 동일합니다. 참조섹션 5.9.6이것이 어떻게 유용한지 알아보겠습니다.
다음으로 시작하는 배트맨 토토 이름pg_시스템용으로 예약되어 있으며 사용자가 만들 수 없습니다.
이전 섹션에서는 배트맨 토토 이름을 지정하지 않고 테이블을 생성했습니다. 기본적으로 이러한 테이블(및 기타 개체)은 자동으로 이름이 지정된 배트맨 토토에 저장됩니다.“공개”. 모든 새 데이터베이스에는 이러한 배트맨 토토가 포함되어 있습니다. 따라서 다음은 동일합니다.
테이블 제품 생성( ... );
그리고:
테이블 생성 public.products ( ... );
정식 이름은 작성하기가 지루하며 어쨌든 특정 배트맨 토토 이름을 응용 프로그램에 연결하지 않는 것이 가장 좋습니다. 따라서 테이블은 종종 다음과 같이 참조됩니다.부적절한 이름, 테이블 이름만으로 구성됩니다. 시스템은 다음을 따라 어떤 테이블이 의미되는지 결정합니다.검색 경로는 살펴볼 배트맨 토토 목록입니다. 검색 경로에서 첫 번째로 일치하는 테이블이 원하는 테이블로 간주됩니다. 검색 경로에 일치하는 항목이 없으면 데이터베이스의 다른 배트맨 토토에 일치하는 테이블 이름이 있더라도 오류가 보고됩니다.
다른 배트맨 토토에서 이름이 같은 개체를 생성하는 기능은 매번 정확하게 동일한 개체를 참조하는 쿼리 작성을 복잡하게 만듭니다. 또한 사용자가 악의적으로 또는 우발적으로 다른 사용자의 쿼리 동작을 변경할 가능성이 있습니다. 쿼리에 정규화되지 않은 이름이 널리 퍼져 있고 그 사용으로 인해포스트그레SQL내부, 배트맨 토토 추가검색_경로모든 사용자가 가지고 있는 것을 효과적으로 신뢰합니다.생성해당 배트맨 토토에 대한 권한입니다. 일반 쿼리를 실행하면 검색 경로의 배트맨 토토에 개체를 생성할 수 있는 악의적인 사용자가 임의의 SQL 함수를 실행하는 것처럼 제어하고 실행할 수 있습니다.
검색 경로에 명명된 첫 번째 배트맨 토토를 현재 배트맨 토토라고 합니다. 검색된 첫 번째 배트맨 토토인 것 외에도 다음과 같은 경우 새 테이블이 생성되는 배트맨 토토이기도 합니다.테이블 생성명령이 배트맨 토토 이름을 지정하지 않습니다.
현재 검색 경로를 표시하려면 다음 명령을 사용하십시오:
검색_경로 표시;
기본 설정에서는 다음이 반환됩니다.
검색_경로 -------------- "$user", 공개
첫 번째 요소는 현재 사용자와 동일한 이름을 가진 배트맨 토토가 검색되도록 지정합니다. 해당 배트맨 토토가 없으면 항목이 무시됩니다. 두 번째 요소는 우리가 이미 본 공개 배트맨 토토를 나타냅니다.
존재하는 검색 경로의 첫 번째 배트맨 토토는 새 개체를 생성하기 위한 기본 위치입니다. 이것이 기본적으로 객체가 공개 배트맨 토토에 생성되는 이유입니다. 배트맨 토토 한정(테이블 수정, 데이터 수정 또는 쿼리 명령) 없이 다른 컨텍스트에서 개체가 참조되는 경우 일치하는 개체를 찾을 때까지 검색 경로가 순회됩니다. 따라서 기본 구성에서 비정규 액세스는 공개 배트맨 토토만 참조할 수 있습니다.
새 배트맨 토토를 경로에 넣기 위해 다음을 사용합니다:
search_path를 myschema,public으로 설정;
(생략함$user여기서 당장 필요하지 않기 때문입니다.) 그런 다음 배트맨 토토 한정 없이 테이블에 액세스할 수 있습니다.
DROP TABLE mytable;
또한, 이후미배트맨 토토은 경로의 첫 번째 요소이며 기본적으로 새 개체가 여기에 생성됩니다.
또한 다음과 같이 작성할 수도 있습니다.
검색_경로를 myschema로 설정;
그러면 우리는 명시적인 자격 없이는 더 이상 공개 배트맨 토토에 접근할 수 없습니다. 공개 배트맨 토토에는 기본적으로 존재한다는 점을 제외하면 특별한 것이 없습니다. 떨어뜨릴 수도 있습니다.
또한 참조토토 사이트 추천 PostgreSQL : 문서 : 15 : 9.26. 시스템 정보 기능 및 운영자배트맨 토토 검색 경로를 조작하는 다른 방법.
검색 경로는 테이블 이름과 마찬가지로 데이터 유형 이름, 함수 이름 및 연산자 이름에 대해 동일한 방식으로 작동합니다. 데이터 유형과 함수 이름은 테이블 이름과 똑같은 방식으로 한정될 수 있습니다. 표현식에 정규화된 연산자 이름을 써야 하는 경우 특별한 조항이 있습니다. 다음과 같이 써야 합니다.
연산자(배트맨 토토.연산자)
이것은 구문의 모호함을 피하기 위해 필요합니다. 예는 다음과 같습니다:
3명의 연산자 선택(pg_catalog.+) 4;
실제로는 그렇게 추악한 내용을 작성할 필요가 없도록 일반적으로 연산자 검색 경로에 의존합니다.
기본적으로 사용자는 자신이 소유하지 않은 배트맨 토토의 개체에 접근할 수 없습니다. 이를 허용하려면 배트맨 토토 소유자가 다음을 부여해야 합니다.사용배트맨 토토에 대한 권한. 기본적으로 모든 사람은 배트맨 토토에 대해 해당 권한을 갖습니다.공개. 사용자가 배트맨 토토의 개체를 사용할 수 있도록 하려면 개체에 적절하게 추가 권한을 부여해야 할 수도 있습니다.
사용자는 다른 사람의 배트맨 토토에 객체를 생성하도록 허용될 수도 있습니다. 이를 허용하려면,생성배트맨 토토에 대한 권한을 부여해야 합니다. 다음에서 업그레이드된 데이터베이스에서PostgreSQL14 이전에는 모든 사람이 배트맨 토토에 대해 해당 권한을 가집니다.공개. 일부사용 패턴해당 특권 취소를 요청합니다:
공개에서 공개 배트맨 토토에 대한 생성 취소;
(첫 번째“공개”배트맨 토토, 두 번째“공개”의미“모든 사용자”. 첫 번째 의미에서는 식별자이고, 두 번째 의미에서는 핵심 단어이므로 대문자 사용이 다릅니다. 가이드라인을 기억해 보세요.섹션 4.1.1.)
추가로공개및 사용자 생성 배트맨 토토, 각 데이터베이스에는pg_catalog배트맨 토토에는 시스템 테이블과 모든 내장 데이터 유형, 함수 및 연산자가 포함되어 있습니다.pg_catalog은 항상 검색 경로의 일부입니다. 경로에 명시적으로 이름이 지정되지 않으면 암시적으로 검색됩니다.이전경로의 배트맨 토토를 검색 중입니다. 이렇게 하면 내장 이름을 항상 찾을 수 있습니다. 그러나 명시적으로 배치할 수 있습니다.pg_catalog사용자 정의 이름이 기본 제공 이름보다 우선하도록 하려면 검색 경로 끝에.
시스템 테이블 이름이 다음으로 시작하므로pg_, 향후 버전에서 테이블과 동일한 이름의 시스템 테이블을 정의하는 경우 충돌이 발생하지 않도록 이러한 이름을 피하는 것이 가장 좋습니다. (기본 검색 경로를 사용하면 테이블 이름에 대한 규정되지 않은 참조가 대신 시스템 테이블로 확인됩니다.) 시스템 테이블은 이름이 다음으로 시작하는 규칙을 계속 따릅니다.pg_, 사용자가 다음을 피하는 한 정규화되지 않은 사용자 테이블 이름과 충돌하지 않도록 합니다.pg_접두사.
배트맨 토토는 다양한 방법으로 데이터를 구성하는 데 사용될 수 있습니다. 갑보안 배트맨 토토 사용 패턴신뢰할 수 없는 사용자가 다른 사용자의 쿼리 동작을 변경하는 것을 방지합니다. 데이터베이스가 보안 배트맨 토토 사용 패턴을 사용하지 않는 경우 해당 데이터베이스를 안전하게 쿼리하려는 사용자는 각 세션이 시작될 때 보호 조치를 취해야 합니다. 구체적으로 다음을 설정하여 각 세션을 시작합니다.검색_경로빈 문자열로 변환하거나 슈퍼유저가 아닌 사용자가 쓸 수 있는 배트맨 토토를 제거하는 방법검색_경로. 기본 구성에서 쉽게 지원되는 몇 가지 사용 패턴이 있습니다.
일반 사용자를 사용자 개인 배트맨 토토로 제한합니다. 이 패턴을 구현하려면 먼저 공개 배트맨 토토가 없는지 확인하세요.생성권한. 그런 다음 임시가 아닌 객체를 생성해야 하는 모든 사용자에 대해 해당 사용자와 동일한 이름으로 배트맨 토토를 생성합니다. 예를 들어배트맨 토토 생성 앨리스 승인 생성. (기본 검색 경로는 다음으로 시작함을 기억하세요.$user, 이는 사용자 이름으로 확인됩니다. 따라서 각 사용자가 별도의 배트맨 토토를 가지고 있는 경우 기본적으로 자신의 배트맨 토토에 액세스합니다.) 이 패턴은 신뢰할 수 없는 사용자가 데이터베이스 소유자이거나 해당 데이터베이스를 보유하지 않는 한 안전한 배트맨 토토 사용 패턴입니다.크리에이터롤권한, 이 경우 보안 배트맨 토토 사용 패턴이 존재하지 않습니다.
에PostgreSQL15 이상에서는 기본 구성이 이 사용 패턴을 지원합니다. 이전 버전에서 또는 이전 버전에서 업그레이드된 데이터베이스를 사용하는 경우 public을 제거해야 합니다.생성다음의 특권공개배트맨 토토(문제공개에서 공개 배트맨 토토에 대한 생성 취소). 그런 다음 감사를 고려하십시오.공개배트맨 토토의 객체와 유사한 이름의 객체에 대한 배트맨 토토pg_catalog.
수정하여 기본 검색 경로에서 공개 배트맨 토토를 제거postgresql.conf또는 발행을 통해역할 모두 설정 변경 search_path = "$user". 그런 다음 공개 배트맨 토토에서 생성할 수 있는 권한을 부여합니다. 정규화된 이름만 공개 배트맨 토토 개체를 선택합니다. 정규화된 테이블 참조는 괜찮지만 공개 배트맨 토토의 함수 호출안전하지 않거나 신뢰할 수 없습니다. 공개 배트맨 토토에서 함수나 확장을 생성하는 경우 대신 첫 번째 패턴을 사용하세요. 그렇지 않으면 첫 번째 패턴과 마찬가지로 신뢰할 수 없는 사용자가 데이터베이스 소유자이거나크리에이터롤특권.
기본 검색 경로를 유지하고 공개 배트맨 토토에서 생성할 수 있는 권한을 부여하십시오. 모든 사용자는 공개 배트맨 토토에 암시적으로 액세스합니다. 이는 배트맨 토토를 전혀 사용할 수 없는 상황을 시뮬레이션하여 배트맨 토토를 인식하지 못하는 세계에서 원활하게 전환합니다. 그러나 이는 결코 안전한 패턴이 아닙니다. 데이터베이스에 단일 사용자가 있거나 상호 신뢰하는 소수의 사용자가 있는 경우에만 허용됩니다. 다음에서 업그레이드된 데이터베이스에서PostgreSQL14 이하, 이것이 기본값입니다.
어떤 패턴에서든 공유 애플리케이션(모든 사람이 사용할 테이블, 제3자가 제공하는 추가 기능 등)을 설치하려면 이를 별도의 배트맨 토토에 넣으십시오. 다른 사용자가 액세스할 수 있도록 적절한 권한을 부여하는 것을 잊지 마십시오. 그런 다음 사용자는 배트맨 토토 이름으로 이름을 한정하여 이러한 추가 개체를 참조하거나 원하는 대로 추가 배트맨 토토를 검색 경로에 넣을 수 있습니다.
SQL 표준에서는 동일한 배트맨 토토의 객체가 다른 사용자에 의해 소유된다는 개념이 존재하지 않습니다. 또한 일부 구현에서는 소유자와 다른 이름을 가진 배트맨 토토를 생성하는 것을 허용하지 않습니다. 실제로 표준에 명시된 기본 배트맨 토토 지원만을 구현하는 데이터베이스 시스템에서는 배트맨 토토와 사용자의 개념이 거의 동일하다. 따라서 많은 사용자는 정규화된 이름이 실제로 다음으로 구성되어 있다고 생각합니다.. 이렇습니다PostgreSQL모든 사용자에 대해 사용자별 배트맨 토토를 생성하면 효과적으로 작동합니다.사용자_이름.테이블_이름
또한 a의 개념이 없습니다공개30669_30764공개배트맨 토토.
물론 일부 SQL 데이터베이스 시스템은 배트맨 토토를 전혀 구현하지 않거나 데이터베이스 간 액세스를 (아마도 제한적으로) 허용하여 네임스페이스 지원을 제공할 수 있습니다. 이러한 시스템으로 작업해야 하는 경우 배트맨 토토를 전혀 사용하지 않으면 이식성이 극대화됩니다.
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.