이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다PostgreSQL : 문서 : 17 : 5.10. 와이즈 토토 베이버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

5.7. 토토 베이

aPostgreSQL데이터베이스 클러스터 하나 이상의 명명 된 데이터베이스가 포함되어 있습니다. 사용자 및 사용자 그룹이 있습니다 전체 클러스터에서 공유하지만 다른 데이터는 공유되지 않습니다. 데이터베이스 전체. 서버에 대한 특정 클라이언트 연결은 할 수 있습니다 단일 데이터베이스의 데이터 만 액세스하는데, 연결 요청.

참고 :클러스터 사용자가 반드시 가지고있는 것은 아닙니다 클러스터의 모든 데이터베이스에 액세스하는 권한. 사용자 공유 이름은 다른 사용자가 이름이 없음을 의미합니다.Joe동일한 클러스터의 두 데이터베이스에서; 그러나 시스템은 허용하도록 구성 될 수 있습니다Joe일부 데이터베이스에만 액세스하십시오.

데이터베이스에는 하나 이상의 이름이 포함되어 있습니다토토 베이,이 테이블이 포함되어 있습니다. 토토 베이도 있습니다 데이터 유형을 포함하여 다른 종류의 명명 된 객체를 포함합니다. 기능 및 연산자. 동일한 개체 이름을 사용할 수 있습니다 갈등이없는 다른 토토 베이; 예를 들어, 둘 다Schema1andmyschemacan 이름이 포함 된 테이블 포함mytable. 같지 않은 데이터베이스, 토토 베이는 엄격하게 분리되지 않았습니다. 사용자가 액세스 할 수 있습니다. 그가 연결된 데이터베이스의 토토 베이의 객체 그가 그렇게 할 특권이 있다면.

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

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

  • 데이터베이스 개체를 논리 그룹으로 구성하여 만들기 위해 더 관리 가능.

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

토토 베이는 운영 체제의 디렉토리와 유사합니다 토토 베이를 중첩 할 수 없다는 점을 제외하고 레벨.

5.7.1. 토토 베이 생성

토토 베이를 만들려면를 사용하십시오.토토 베이 생성명령. 토토 베이를 제공하십시오 당신이 선택한 이름. 예를 들어:

토토 베이 생성 myschema;

토토 베이에서 객체를 작성하거나 액세스하려면 A 쓰기적격 이름토토 베이 이름으로 구성되어 있습니다 테이블 이름은 점으로 구분됩니다 :

토토 베이.테이블

이것은 테이블 이름이 예상되는 모든 곳에서 작동합니다. 테이블 수정 명령 및 설명 된 데이터 액세스 명령 다음 장에서. (간결하게 우리는 테이블에 대해 말할 것입니다 단지, 그러나 같은 아이디어는 다른 종류의 이름이 지정된 개체에 적용됩니다. 유형 및 기능과 같은.)

12625_12665

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

도 사용할 수 있지만 현재는입니다.Pro FormaSQL 표준 준수. 만약에 데이터베이스 이름을 작성하고 데이터베이스와 동일해야합니다. 연결되어 있습니다.

새 토토 베이에서 테이블을 만들려면 다음을 사용합니다.

테이블 작성 myschema.mytable (
 ...
);

비어 있으면 토토 베이를 삭제하려면 (모든 개체가 드롭), 사용 :

토토 베이 drop myschema;

포함 된 모든 객체를 포함하여 토토 베이를 삭제하려면 사용 :

토토 베이 DROP SCHEMA MYSCHEMA CASCADE;

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

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

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

토토 베이 이름을 생략 할 수도 있습니다.이 경우 토토 베이 이름입니다. 사용자 이름과 동일합니다. 보다섹션 5.7.6방법 이것은 유용 할 수 있습니다.

토토 베이 이름으로 시작하는PG_시스템 목적으로 예약되어 있으며 사용자가 생성 할 수 없습니다.

5.7.2. 공공 토토 베이

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

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

and :

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

5.7.3. 토토 베이 검색 경로

자격을 갖춘 이름은 쓰기가 지루하며 종종 가장 좋습니다. 어쨌든 특정 토토 베이 이름을 응용 프로그램에 연결하십시오. 그러므로 테이블은 종종에 의해 언급됩니다.자격이없는 이름는 테이블 이름으로 구성됩니다. 시스템 a를 따르는 것이 어떤 테이블을 의미하는지 결정합니다.검색 경로, 이것은 볼 수있는 토토 베이 목록입니다. 검색 경로의 첫 번째 일치 테이블은 하나가됩니다. 원해. 검색 경로에 일치하지 않으면 오류는 일치하는 테이블 이름이 다른 토토 베이에 존재하더라도보고되었습니다. 데이터베이스.

다른 토토 베이에서 이름과 같은 개체를 만들 수있는 기능 참조가 정확하게 동일하게 쿼리를 작성하는 것을 복잡하게 만듭니다 매번 물체. 또한 사용자의 잠재력을 열어줍니다 다른 사용자의 쿼리의 동작을 악의적으로 변경하십시오 우연히. 쿼리에서 자격이없는 이름의 유병률로 인해 그리고 그들의 사용PostgreSQL내부, 토토 베이 추가search_path모든 사용자를 효과적으로 신뢰하는생성해당 토토 베이의 권한. 일반 쿼리를 실행하면 a 악성 사용자가 검색 토토 베이에서 객체를 생성 할 수 있습니다. 경로는 제어를 취하고 마치 마치 마치 마치 임의의 SQL 기능을 실행할 수 있습니다. 당신은 그들을 처형했습니다.

검색 경로에 명명 된 첫 번째 토토 베이를 전류라고합니다. 개요. 첫 번째 토토 베이가 검색 한 것 외에도 이면 새 테이블을 만들 수있는 토토 베이테이블 만들기명령은 토토 베이를 지정하지 않습니다 이름.

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

show search_path;

기본 설정 에서이 반환이 반환됩니다.

search_path
--------------
 "$ user", public

첫 번째 요소는 이름이 같은 토토 베이를 지정합니다. 현재 사용자를 검색해야합니다. 그러한 토토 베이가 존재하지 않으면 입력은 무시됩니다. 두 번째 요소는 공개 토토 베이를 나타냅니다 우리가 이미 본 것.

존재하는 검색 경로의 첫 번째 토토 베이는 기본값입니다. 새 개체를 만드는 위치. 그것이 그 이유입니다 기본 객체는 공개 토토 베이에서 생성됩니다. 객체가있을 때 토토 베이 자격이없는 다른 컨텍스트에서 참조됩니다 (표 수정, 데이터 수정 또는 쿼리 명령) 검색 경로 일치하는 객체가 발견 될 때까지 가로옵니다. 그러므로 기본 구성, 자격이없는 액세스는 다시 참조 할 수 있습니다 공공 토토 베이에.

새로운 토토 베이를 경로에 넣으려면 다음을 사용합니다.

Search_Path를 MySchema, public;에 설정하십시오.

(우리는 생략$ user우리가 가지고 있기 때문에 여기 즉시 필요하지 않습니다.) 그리고 우리는없이 테이블에 액세스 할 수 있습니다. 토토 베이 자격 :

드롭 테이블 mytable;

이후myschema첫 번째입니다 경로의 요소, 새로운 객체는 기본적으로 그것.

우리는 또한 다음과 같이 쓸 수 있습니다.

Search_Path를 myschema로 설정하십시오;

그러면 우리는 더 이상 공개 토토 베이에 액세스 할 수 없습니다. 명백한 자격. 대중에게는 특별한 것이 없습니다 기본적으로 존재한다는 토토 베이. 떨어질 수 있습니다. 도.

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

검색 경로는 데이터 유형 이름과 동일한 방식으로 작동합니다. 테이블 이름과 마찬가지로 함수 이름 및 연산자 이름. 데이터 유형 및 기능 이름은 테이블 이름. 자격을 갖춘 운영자 이름을 표현, 특별 조항이 있습니다 : 당신은 작성해야합니다

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

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

선택 3 연산자 (PG_CATALOG.+) 4;

실제로는 일반적으로 연산자의 검색 경로에 의존합니다. 그래서 그렇게 못 생겼지 않아야합니다.

5.7.4. 토토 베이 및 특권

기본적으로 사용자는 토토 베이의 객체에 액세스 할 수 없습니다. 소유가 아닙니다. 이를 허용하기 위해 토토 베이의 소유자는를 부여해야합니다.usage토토 베이의 권한. 허용합니다 토토 베이에서 객체를 사용하여 추가 특권은 물체.

사용자는 다른 사람의 객체를 만들 수 있습니다. 개요. 그것을 허용하기 위해,Create토토 베이의 권한을 부여해야합니다. 기본적으로 모두가 있습니다Createandusage토토 베이의 권한public. 이를 통해 모든 사용자가 할 수있는 모든 사용자가 가능합니다 주어진 데이터베이스에 연결하여을 생성합니다.public토토 베이. 일부사용 패턴전화 그 특권 취소 :

공개에서 토토 베이 대중에 대한 Revoke 만들기;

(첫 번째"public"토토 베이입니다. 두 번째"public"평균"모든 사용자". 첫 번째 의미에서 그것은입니다 식별자, 두 번째 의미에서는 핵심 단어이므로 다른 대문자; 의 지침을 상기섹션 4.1.1.)

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

외에public그리고 사용자가 만들었습니다 토토 베이, 각 데이터베이스에는가 포함됩니다.PG_CATALOG시스템 테이블을 포함하는 토토 베이 그리고 모든 내장 데이터 유형, 기능 및 운영자.PG_CATALOG항상 효과적으로 일부입니다 검색 경로. 경로에서 명시 적으로 명명되지 않은 경우 암시 적으로 검색경로의 토토 베이 검색. 이렇게하면 내장 이름이 항상 찾을 수 있습니다. 하지만, 명시 적으로 배치 할 수 있습니다PG_CATALOGat 사용자 정의 이름을 선호하는 경우 검색 경로 끝 내장 이름을 무시합니다.

inPostgreSQL이전 버전 7.3,로 시작하는 테이블 이름PG_예약된. 이것은 더 이상 사실이 아닙니다 : 그러한 테이블 이름을 만들 수 있습니다. 원한다면 비 시스템 토토 베이에서. 그러나 가장 좋습니다 당신이 고통받지 않도록 그러한 이름을 계속 피하십시오. 미래 버전이 당신의 테이블과 동일합니다. (기본 검색 경로를 사용하면 자격이 없습니다 그런 다음 테이블 이름에 대한 참조는 시스템으로 해결됩니다. 대신 테이블.) 시스템 테이블은 계속됩니다 이름을 시작하는 컨벤션PG_, 그들이 자격이없는 것과 충돌하지 않도록 사용자가 피하는 한 사용자 테이블 이름PG_Prefix.

5.7.6. 사용 패턴

토토 베이를 사용하여 여러 가지 방법으로 데이터를 구성 할 수 있습니다. 거기 기본적으로 쉽게 지원되는 몇 가지 사용 패턴입니다. 데이터베이스 사용자 일 때만 구성되며 구성 다른 데이터베이스 사용자 오해 :

  • 일반 사용자를 사용자-민간 토토 베이로 제한합니다. 구현하려면 이 문제토토 베이 공개에서 생성을 철회합니다 공공의, 동일한 이름으로 각 사용자에 대한 토토 베이를 만듭니다. 그 사용자로서. 영향을받는 사용자 가이 전에 로그인 한 경우 고려하십시오 토토 베이의 개체와 같은 이름이 지정된 개체에 대한 공개 토토 베이 감사PG_CATALOG. 기본 검색을 상기하십시오 경로는로 시작합니다.$ user사용자 이름. 따라서 각 사용자가 별도의 토토 베이가있는 경우 기본적으로 자신의 토토 베이에 액세스하십시오.

  • 각 사용자의 기본 검색 경로에서 공개 토토 베이 제거 사용ALTER 역할사용자set search_path = "$ user". 모든 사람 공개 토토 베이에서 객체를 만들 수있는 기능을 유지하지만 자격을 갖춘 이름 만 해당 객체를 선택합니다. 자격을 갖춘 동안 테이블 참조는 괜찮습니다. 공개 토토 베이의 기능에 대한 호출안전하지 않거나 신뢰할 수 없습니다. 또한을 보유한 사용자Createole권한은이 설정을 취소하고 임의의 쿼리를 발행 할 수 있습니다. 사용자의 신원은 설정에 의존합니다. 당신이 만든 경우 공공 토토 베이 또는 보조금의 기능 또는 확장Createrole이를 보증하지 않는 사용자에게 거의 수퍼 루저 능력, 대신 첫 번째 패턴을 사용하십시오.

  • 공개 토토 베이 제거search_pathinpostgresql.conf. 이어지는 사용자 경험 이전 패턴과 일치합니다. 그 패턴 외에도 함수에 대한 시사점 및Createrole, 데이터베이스 소유자가를 신뢰합니다.Createrole. 함수 또는 확장자를 작성하는 경우 공개 토토 베이 또는 할당Createrole특권,createb특권 또는 보증하지 않는 사용자에 대한 개별 데이터베이스 소유권 거의 슈퍼 라이저 액세스, 대신 첫 번째 패턴을 사용하십시오.

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

모든 패턴의 경우 공유 응용 프로그램을 설치하려면 (테이블이 모든 사람이 사용, 제 3자가 제공 한 추가 기능, 등), 별도의 토토 베이에 넣으십시오. 부여하는 것을 잊지 마십시오 다른 사용자가 액세스 할 수있는 적절한 권한. 그런 다음 사용자는 토토 베이 이름이있는 이름 또는 추가 토토 베이를 넣을 수 있습니다. 그들이 선택한대로 그들의 검색 경로로.

5.7.7. 이식성

SQL 표준에서 동일한 토토 베이에서 객체의 개념 다른 사용자가 소유하는 것은 존재하지 않습니다. 또한 일부 구현은 당신이 소유자와 다른 이름. 실제로, 토토 베이의 개념 그리고 사용자는 데이터베이스 시스템에서 거의 동등합니다. 표준에 지정된 기본 토토 베이 지원 만 그러므로, 많은 사용자가 자격을 갖춘 이름을 실제로 구성한다고 생각합니다사용자 이름.TableName. 이것은 방법입니다PostgreSQL당신이 효과적으로 행동 할 것입니다 모든 사용자를위한 사용자 별 토토 베이를 만듭니다.

또한 a 개념이 없습니다.공개SQL 표준의 토토 베이. 최대의 순응을 위해 표준, 당신은를 사용해서는 안됩니다public토토 베이.

물론 일부 SQL 데이터베이스 시스템은 Schemas를 구현하지 않을 수 있습니다. 전혀, 또는 허용 (아마도 제한)를 통해 네임 스페이스 지원을 제공합니다. 교차-다베이스 액세스. 그러한 시스템으로 작업해야한다면 Schemas를 사용하지 않음으로써 최대 이식성이 달성됩니다. 모두.