이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.PostgreSQL : 문서 : 17 : 5.10. 와이즈 토토버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

5.7. 토토 베이

A 포스트그레SQL데이터베이스 클러스터 하나 이상의 명명된 데이터베이스를 포함합니다. 사용자 및 사용자 그룹은 다음과 같습니다. 전체 클러스터에서 공유되지만 다른 데이터는 공유되지 않습니다. 데이터베이스 전반에 걸쳐. 서버에 대한 특정 클라이언트 연결은 다음과 같습니다. 단일 데이터베이스의 데이터에만 액세스합니다. 연결을 요청합니다.

참고:클러스터 사용자는 반드시 클러스터의 모든 데이터베이스에 액세스할 수 있는 권한입니다. 사용자 공유 이름은 다른 사용자 이름이 있을 수 없음을 의미합니다.동일한 클러스터에 있는 두 개의 데이터베이스에 있습니다. 하지만 시스템은 다음을 허용하도록 구성될 수 있습니다.일부 데이터베이스에만 액세스합니다.

데이터베이스에는 하나 이상의 이름이 포함되어 있습니다.토토 베이, 여기에는 테이블이 포함됩니다. 토토 베이도 데이터 유형을 포함하여 다른 종류의 명명된 개체를 포함합니다. 함수, 연산자. 동일한 개체 이름을 사용할 수 있습니다. 충돌 없는 다양한 토토 베이; 예를 들어 둘 다토토 베이1그리고미토토 베이할 수 있다 이름이 지정된 테이블을 포함합니다.마이테이블. 달리 데이터베이스, 토토 베이는 엄격하게 분리되지 않습니다. 사용자가 액세스할 수 있습니다. 그가 연결된 데이터베이스의 토토 베이에 있는 객체, 그에게 그렇게 할 수 있는 특권이 있다면.

토토 베이를 사용하려는 데에는 몇 가지 이유가 있습니다:

  • 많은 사용자가 방해 없이 하나의 데이터베이스를 사용할 수 있도록 하기 위해 서로.

  • 데이터베이스 개체를 논리적 그룹으로 구성하여 더 관리하기 쉽습니다.

  • 타사 응용 프로그램은 별도의 토토 베이에 넣을 수 있으므로 다른 객체의 이름과 충돌하지 않습니다.

토토 베이는 운영 체제의 디렉토리와 유사합니다. 단, 토토 베이는 중첩될 수 없다는 점만 제외됩니다.

5.7.1. 토토 베이 생성

토토 베이를 생성하려면 다음을 사용하십시오.토토 베이 생성명령. 토토 베이를 제공 원하는 이름. 예를 들면:

SCHEMA myschema 생성;

토토 베이에서 개체를 생성하거나 액세스하려면 다음을 작성하세요.정식 이름토토 베이 이름과 점으로 구분된 테이블 이름:

토토 베이.테이블

이것은 다음을 포함하여 테이블 이름이 예상되는 모든 곳에서 작동합니다. 테이블 수정 명령과 데이터 액세스 명령에 대해 논의 다음 장에서. (간결하게 하기 위해 테이블에 대해 이야기하겠습니다. 하지만 다른 종류의 명명된 객체에도 동일한 아이디어가 적용됩니다. 유형, 함수 등)

사실, 훨씬 더 일반적인 구문

데이터베이스.토토 베이.테이블

또한 사용할 수 있지만 현재는 이것은 단지프로 형식SQL 표준 준수. 만약에 데이터베이스 이름을 작성하면 데이터베이스 이름과 동일해야 합니다. 에 연결되어 있습니다.

따라서 새 토토 베이에 테이블을 생성하려면 다음을 사용하십시오:

CREATE TABLE myschema.mytable(
 ...
);

토토 베이가 비어 있는 경우 삭제하려면(그 안에 있는 모든 객체는 삭제됨) 다음을 사용하세요.

DROP SCHEMA myschema;

포함된 모든 개체를 포함하는 토토 베이를 삭제하려면 다음을 사용하십시오:

DROP SCHEMA myschema CASCADE;

참조사설 토토 : 문서 : 9.3 : 종속성 추적설명 이 뒤에 있는 일반적인 메커니즘에 대해 설명합니다.

종종 다른 사람이 소유한 토토 베이를 생성하고 싶을 것입니다 (이것은 귀하의 활동을 제한하는 방법 중 하나이기 때문에 잘 정의된 네임스페이스에 대한 사용자). 이에 대한 구문은 다음과 같습니다.

토토 베이 생성토토 베이이름승인사용자 이름;

토토 베이 이름을 생략할 수도 있습니다. 이 경우 토토 베이 이름은 사용자 이름과 동일합니다. 참조섹션 5.7.6어떻게 이것이 유용할 수 있습니다.

다음으로 시작하는 토토 베이 이름pg_있습니다 시스템 목적으로 예약되어 있으며 사용자가 만들 수 없습니다.

5.7.2. 공개 토토 베이

이전 섹션에서 우리는 지정하지 않고 테이블을 만들었습니다. 모든 토토 베이 이름. 기본적으로 이러한 테이블(및 기타 개체)은 다음과 같습니다. 자동으로 이름이 지정된 토토 베이에 넣습니다."공개". 모든 새 데이터베이스에는 이러한 토토 베이가 포함되어 있습니다. 따라서 다음은 동일합니다.

테이블 제품 생성( ... );

그리고:

테이블 생성 public.products ( ... );

5.7.3. 토토 베이 검색 경로

적격 이름은 작성하기가 지루하며 종종 작성하지 않는 것이 가장 좋습니다 어쨌든 특정 토토 베이 이름을 애플리케이션에 연결하십시오. 그러므로 테이블은 종종 다음으로 참조됩니다.자격 없음 이름, 테이블 이름만으로 구성됩니다. 시스템 다음을 따라 어떤 테이블이 의미되는지 결정합니다.검색 경로은 살펴볼 토토 베이 목록입니다. 검색 경로에서 첫 번째로 일치하는 테이블이 해당 테이블로 간주됩니다. 원했다. 검색 경로에 일치하는 항목이 없으면 오류가 발생합니다. 일치하는 테이블 이름이 다른 토토 베이에 존재하는 경우에도 보고됩니다. 데이터베이스.

다른 토토 베이에서 같은 이름의 개체를 생성하는 기능 정확히 동일한 내용을 참조하는 쿼리 작성이 복잡해집니다. 매번 물건. 또한 사용자에게 다음과 같은 가능성을 열어줍니다. 다른 사용자의 쿼리 동작을 악의적으로 변경하거나 우연히. 쿼리에 정규화되지 않은 이름이 널리 퍼져 있기 때문에 및 그 용도PostgreSQL내부, 토토 베이 추가검색_경로모든 사용자가 가지고 있는 것을 효과적으로 신뢰합니다.만들기해당 토토 베이에 대한 권한입니다. 일반 쿼리를 실행하면 악의적인 사용자가 검색 토토 베이에 객체를 생성할 수 있음 경로는 임의의 SQL 함수를 제어하고 실행할 수 있습니다. 당신이 그들을 처형했습니다.

검색 경로에 명명된 첫 번째 토토 베이는 현재 토토 베이라고 합니다. 토토 베이. 검색된 첫 번째 토토 베이인 것 외에도, 다음과 같은 경우 새 테이블이 생성될 토토 베이테이블 생성명령이 토토 베이를 지정하지 않습니다. 이름.

현재 검색 경로를 표시하려면 다음 명령을 사용하십시오:

검색_경로 표시;

기본 설정에서는 다음이 반환됩니다:

검색_경로
--------------
 "$user",공개

첫 번째 요소는 다음과 같은 이름을 가진 토토 베이를 지정합니다. 현재 사용자를 검색합니다. 그러한 토토 베이가 존재하지 않는 경우, 항목은 무시됩니다. 두 번째 요소는 공개 토토 베이를 참조합니다. 우리는 이미 본 적이 있습니다.

존재하는 검색 경로의 첫 번째 토토 베이가 기본값입니다. 새 개체를 만드는 위치입니다. 그 이유는 다음과 같습니다 기본 개체는 공개 토토 베이에 생성됩니다. 객체가 있을 때 토토 베이 한정 없이 다른 컨텍스트에서 참조됨(테이블 수정, 데이터 수정 또는 쿼리 명령) 검색 경로 일치하는 객체를 찾을 때까지 순회합니다. 따라서 기본 구성, 자격이 없는 액세스는 다시 참조만 가능합니다. 공개 토토 베이에.

새 토토 베이를 경로에 넣기 위해 다음을 사용합니다:

search_path를 myschema,public으로 설정;

(생략함$user여기서 우리는 즉시 필요하지 않습니다.) 그런 다음 우리는 없이도 테이블에 액세스할 수 있습니다. 토토 베이 한정:

DROP TABLE mytable;

또한 이후미토토 베이첫 번째입니다 요소가 경로에 있으면 기본적으로 새 객체가 생성됩니다. 그것.

다음과 같이 작성할 수도 있습니다.

검색_경로를 myschema로 설정;

그러면 우리는 더 이상 공개 토토 베이에 접근할 수 없습니다. 명시적인 자격. 대중에게는 특별한 것이 없다. 기본적으로 존재한다는 점을 제외하면 토토 베이입니다. 떨어뜨릴 수도 있고, 너무.

또한 참조윈 토토 PostgreSQL : 문서 : 9.3 : 시스템 정보 기능용 토토 베이 검색 경로를 조작하는 다른 방법.

검색 경로는 데이터 유형 이름에 대해 동일한 방식으로 작동합니다. 테이블 이름과 마찬가지로 함수 이름, 연산자 이름도 있습니다. 데이터 유형과 함수 이름은 다음과 정확히 같은 방식으로 한정될 수 있습니다. 테이블 이름. 정규화된 운영자 이름을 작성해야 하는 경우 표현에는 특별한 조항이 있습니다. 반드시 작성해야 합니다.

연산자(토토 베이.연산자)

구문적 모호성을 피하기 위해 필요합니다. 예는 다음과 같습니다:

3명의 연산자 선택(pg_catalog.+) 4;

실제로는 일반적으로 연산자 검색 경로에 의존합니다. 그렇게 추한 글을 쓸 필요가 없도록 말이죠.

5.7.4. 토토 베이 및 권한

기본적으로 사용자는 자신이 수행하는 토토 베이의 개체에 액세스할 수 없습니다. 소유하지 않음. 이를 허용하려면 토토 베이 소유자가 다음을 부여해야 합니다.사용토토 베이에 대한 권한입니다. 허용하려면 사용자는 토토 베이의 객체를 활용하고, 추가 상황에 따라 특권을 부여해야 할 수도 있습니다. 개체.

사용자는 다른 사람의 개체를 생성하도록 허용될 수도 있습니다. 토토 베이. 이를 허용하려면,만들기토토 베이에 대한 권한을 부여해야 합니다. 기본적으로 다들 갖고 계시죠생성사용토토 베이에 대한 권한공개. 이를 통해 다음을 수행할 수 있는 모든 사용자가 특정 데이터베이스에 연결하여 해당 데이터베이스에 객체를 생성합니다.공개토토 베이. 일부사용 패턴요청 해당 권한을 취소합니다:

공개에서 공개 토토 베이에 대한 생성 취소;

(첫 번째"공개"토토 베이입니다. 두 번째"공개"의미"모든 사용자". 첫 번째 의미에서 그것은 식별자는 두 번째 의미에서 핵심 단어이므로 다른 대문자 사용; 가이드라인을 기억해 보세요.섹션 4.1.1.)

5.7.5. 시스템 카탈로그 토토 베이

추가로공개및 사용자 생성 토토 베이, 각 데이터베이스에는 다음이 포함됩니다.pg_catalog20985_21088pg_catalog항상 효과적으로 다음의 일부입니다. 검색 경로. 경로에 명시적으로 이름이 지정되지 않은 경우 암시적으로 검색됩니다.이전경로의 토토 베이를 검색 중입니다. 이렇게 하면 내장 이름을 항상 찾을 수 있습니다. 그러나, 명시적으로 배치할 수 있습니다.pg_catalog에 사용자 정의 이름을 선호하는 경우 검색 경로 끝 기본 제공 이름을 재정의합니다.

포스트그레SQL이전 버전 7.3, 로 시작하는 테이블 이름pg_였습니다 예약되었습니다. 이것은 더 이상 사실이 아닙니다. 이러한 테이블 이름을 만들 수 있습니다 원하는 경우 시스템이 아닌 토토 베이에서. 그러나 가장 좋은 방법은 그런 이름을 계속 피하십시오. 일부 향후 버전에서 이름이 지정된 시스템 테이블을 정의하면 충돌이 발생합니다. 네 테이블이랑 똑같아. (기본 검색 경로를 사용하면 정규화되지 않은 그러면 테이블 이름에 대한 참조가 시스템으로 해결됩니다. 대신 테이블을 사용하세요.) 시스템 테이블은 계속해서 다음을 따릅니다. 로 시작하는 이름을 갖는 규칙pg_, 자격이 없는 사용자와 충돌하지 않도록 사용자가 다음을 피하는 한 사용자 테이블 이름은pg_접두사.

5.7.6. 사용 패턴

토토 베이는 다양한 방법으로 데이터를 구성하는 데 사용될 수 있습니다. 거기 기본적으로 쉽게 지원되는 몇 가지 사용 패턴은 다음과 같습니다. 구성. 데이터베이스 사용자의 경우 하나만 있으면 충분합니다. 다른 데이터베이스 사용자를 불신합니다:

  • 일반 사용자를 사용자 개인 토토 베이로 제한합니다. 구현하려면 이 문제다음에서 공개 토토 베이에 대한 생성 취소 공개, 동일한 이름을 가진 각 사용자에 대한 토토 베이를 생성합니다. 그 사용자로서. 영향을 받은 사용자가 이전에 로그인한 경우 다음을 고려하십시오. 토토 베이의 객체와 유사한 이름의 객체에 대한 공개 토토 베이 감사pg_catalog. 기본 검색은 경로는 다음으로 시작됩니다.$user, 다음으로 해결됩니다. 사용자 이름. 따라서 각 사용자가 별도의 토토 베이를 가지고 있는 경우 기본적으로 자체 토토 베이에 액세스합니다.

  • 각 사용자의 기본 검색 경로에서 공개 토토 베이를 제거합니다. 사용 중역할 변경사용자SET search_path = "$user". 모두 공개 토토 베이에서 객체를 생성하는 기능은 유지하지만 자격을 갖춘 이름만이 해당 개체를 선택합니다. 자격을 갖춘 동안 테이블 참조는 괜찮습니다. 공개 토토 베이의 함수 호출안전하지 않거나 신뢰할 수 없습니다. 또한, 사용자는크리에이터롤권한은 이 설정을 취소하고 아래에서 임의의 쿼리를 발행할 수 있습니다. 설정에 의존하는 사용자의 신원. 생성하면 공개 토토 베이 또는 부여의 기능 또는 확장크리에이터롤이를 보증하지 않는 사용자에게 거의 슈퍼유저 능력이 있는 경우 대신 첫 번째 패턴을 사용하세요.

  • 공개 토토 베이 제거검색_경로inpostgresql.conf. 이어지는 사용자 경험 이전 패턴과 일치합니다. 그 패턴 외에도 기능에 대한 영향 및크리에이터롤, 이는 다음과 같은 데이터베이스 소유자를 신뢰합니다.크리에이터롤. 함수나 확장을 생성하는 경우 공개 토토 베이를 사용하거나크리에이터롤특권,CREATEDB권한 또는 보증하지 않는 사용자에게 개별 데이터베이스 소유권 거의 수퍼유저 액세스인 경우 대신 첫 번째 패턴을 사용하세요.

  • 기본값을 유지하십시오. 모든 사용자는 공개 토토 베이에 암시적으로 액세스합니다. 이는 토토 베이를 사용할 수 없는 상황을 시뮬레이션합니다. 모두 비토토 베이 인식 세계에서 원활한 전환을 제공합니다. 그러나 모든 사용자는 다음의 ID로 임의의 쿼리를 실행할 수 있습니다. 자신을 개별적으로 보호하기로 선택하지 않은 사용자. 이 패턴 데이터베이스에 단일 사용자 또는 몇 명의 사용자가 있는 경우에만 허용됩니다. 상호 신뢰하는 사용자입니다.

어떤 패턴에서든 공유 응용프로그램(테이블을 설치하려면 모두가 사용하는 기능, 제3자가 제공하는 추가 기능, 등) 별도의 토토 베이에 넣습니다. 부여하는 것을 잊지 마세요 다른 사용자가 액세스할 수 있도록 적절한 권한을 부여합니다. 그런 다음 사용자는 다음을 한정하여 이러한 추가 개체를 참조할 수 있습니다. 토토 베이 이름으로 이름을 지정하거나 추가 토토 베이를 넣을 수 있습니다. 원하는 대로 검색 경로에 추가됩니다.

5.7.7. 이식성

SQL 표준에서 동일한 토토 베이의 객체 개념은 다른 사용자가 소유하는 것은 존재하지 않습니다. 게다가 일부 구현에서는 다음을 갖는 토토 베이를 생성하는 것을 허용하지 않습니다. 주인과 이름이 다릅니다. 실제로 토토 베이의 개념은 및 사용자는 다음을 구현하는 데이터베이스 시스템에서 거의 동일합니다. 표준에 지정된 기본 토토 베이 지원만 가능합니다. 그러므로, 많은 사용자는 정규화된 이름이 실제로 다음으로 구성되어 있다고 생각합니다.사용자 이름.테이블 이름. 이렇습니다PostgreSQL다음과 같은 경우 효과적으로 작동합니다. 모든 사용자에 대해 사용자별 토토 베이를 생성합니다.

또한 a의 개념이 없습니다.공개26573_26668공개토토 베이.

물론 일부 SQL 데이터베이스 시스템은 토토 베이를 구현하지 않을 수도 있습니다 또는 허용하여(아마도 제한됨) 네임스페이스 지원을 제공합니다. 데이터베이스 간 액세스. 해당 시스템을 사용하여 작업해야 한다면 토토 베이를 사용하지 않으면 이식성이 극대화됩니다. 모두.