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

5.8. 토토 캔

apostgresql데이터베이스 클러스터에는 하나 이상의 명명 된 데이터베이스가 포함되어 있습니다. 역할과 몇 가지 다른 객체 유형은 전체 클러스터에서 공유됩니다. 서버에 대한 클라이언트 연결은 단일 데이터베이스에서 데이터에만 액세스 할 수 있으며 연결 요청에 지정된 것입니다.

Note

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

데이터베이스에는 하나 이상의 이름이 포함되어 있습니다토토 캔. Schemas에는 데이터 유형, 기능 및 연산자를 포함하여 다른 종류의 명명 된 객체도 포함되어 있습니다. 동일한 개체 이름은 충돌없이 다른 토토 캔에서 사용할 수 있습니다. 예를 들어, 둘 다토토 캔 1andmyschema이름이 지정된 테이블을 포함 할 수 있습니다mytable. 데이터베이스와 달리 Schemas는 엄격하게 분리되지 않습니다. 사용자는 연결된 데이터베이스의 토토 캔에서 객체에 액세스 할 수 있습니다..

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

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

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

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

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

5.8.1. 토토 캔 생성

토토 캔를 만들려면를 사용하십시오.토토 캔 생성명령. 토토 캔에 선택한 이름을 부여하십시오. 예를 들어:

토토 캔 생성 myschema;

토토 캔에서 개체를 작성하거나 액세스하려면 a 쓰기적격 이름토토 캔 이름과 테이블 이름으로 구성되어 있습니다.

토토 캔.테이블

이것은 테이블 수정 명령 및 다음 장에서 논의 된 데이터 액세스 명령을 포함하여 테이블 이름이 예상되는 곳에서 작동합니다. (Brevity를 위해 우리는 테이블에 대해서만 말할 것이지만, 같은 아이디어는 유형 및 기능과 같은 다른 종류의 명명 된 객체에 적용됩니다.)

실제로 더 일반적인 구문

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

도 사용할 수 있지만 현재는입니다.프로 포르마SQL 표준 준수. 데이터베이스 이름을 작성하는 경우 연결된 데이터베이스와 동일해야합니다.

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

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

비어있는 경우 토토 캔를 삭제하려면 (모든 개체가 삭제 되었음) 사용 :

토토 캔 drop schema myschema;

포함 된 모든 객체를 포함한 토토 캔를 삭제하려면 사용 :

토토 캔 DROP SCHEMA MYSCHEMA CASCADE;

참조PostgreSQL : 문서 : 10 : 5.13.스포츠 토토 사이트 추적이 뒤에있는 일반적인 메커니즘에 대한 설명은

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

토토 캔 생성Schema_Name승인user_name;

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

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

5.8.2. 공공 토토 캔

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

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

and :

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

5.8.3. 토토 캔 검색 경로

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

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

검색 경로에서 명명 된 첫 번째 토토 캔를 현재 토토 캔라고합니다. 첫 번째 토토 캔 검색 외에도이면 새 테이블이 생성되는 토토 캔이기도합니다.테이블 생성명령은 토토 캔 이름을 지정하지 않습니다.

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

show search_path;

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

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

첫 번째 요소는 현재 사용자와 동일한 이름을 가진 토토 캔를 검색 할 것을 지정합니다. 그러한 토토 캔가 존재하지 않으면 항목이 무시됩니다. 두 번째 요소는 우리가 이미 본 공개 토토 캔를 말합니다.

존재하는 검색 경로의 첫 번째 토토 캔는 새 개체를 만드는 기본 위치입니다. 그렇기 때문에 기본적으로 객체가 공개 토토 캔에서 생성되는 이유입니다. 토토 캔 자격이없는 다른 컨텍스트에서 객체가 참조되면 (테이블 수정, 데이터 수정 또는 쿼리 명령) 일치하는 객체가 발견 될 때까지 검색 경로가 통과됩니다. 따라서 기본 구성에서 자격이없는 액세스는 다시 공개 토토 캔 만 참조 할 수 있습니다.

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

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

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

드롭 테이블 mytable;

이후myschema경로의 첫 번째 요소는 기본적으로 기본적으로 생성 될 것입니다.

우리는 또한 다음을 쓸 수 있습니다.

Search_Path를 myschema로 설정하십시오;

그러면 더 이상 명시 적 자격없이 공개 토토 캔에 액세스 할 수 없습니다. 기본적으로 존재한다는 것을 제외하고는 공개 토토 캔에 대해 특별한 것이 없습니다. 도착할 수 있습니다.

참조PostgreSQL : 문서 : 10 : 9.25. 시스템 젠 토토 기능토토 캔 검색 경로를 조작하는 다른 방법.

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

연산자 (토토 캔.운영자)

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

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

실제로는 일반적으로 연산자의 검색 경로에 의존하여 그처럼 못 생겼지 않아야합니다.

5.8.4. 토토 캔 및 특권

기본적으로 사용자는 소유하지 않은 토토 캔의 객체에 액세스 할 수 없습니다. 이를 허용하기 위해 토토 캔의 소유자는를 부여해야합니다.usage토토 캔의 권한. 사용자가 토토 캔에서 객체를 사용할 수 있도록 추가 권한을 객체에 적합하게 부여해야 할 수도 있습니다.

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

공개에서 토토 캔 대중에 대한 Revoke Create Create;

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

5.8.5. 시스템 카탈로그 토토 캔

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

시스템 테이블 이름이 시작되므로PG_, 미래 버전에서 테이블과 동일하게 이름이 지정된 시스템 테이블을 정의하면 충돌을 겪지 않도록 그러한 이름을 피하는 것이 가장 좋습니다. (기본 검색 경로를 사용하면 테이블 이름에 대한 자격이없는 참조가 대신 시스템 테이블로 해결됩니다.) 시스템 테이블은로 시작하는 컨벤션을 계속 따릅니다.PG_, 사용자가 피하는 한 자격이없는 사용자 테이블 이름과 충돌하지 않도록PG_prefix.

5.8.6. 사용 패턴

토토 캔를 사용하여 여러 가지 방법으로 데이터를 구성 할 수 있습니다. 에이보안 토토 캔 사용 패턴신뢰할 수없는 사용자가 다른 사용자의 쿼리의 동작을 변경하지 못하게합니다. 데이터베이스가 보안 토토 캔 사용 패턴을 사용하지 않으면 데이터베이스가 각 세션 시작시 보호 조치를 취할 수있는 사용자는 안전하게 쿼리하려고합니다. 구체적으로, 그들은 각 세션을 설정하여 시작합니다search_path빈 문자열에 또는 다른 방식으로 비 슈퍼 라이저 작성된 토토 캔를 제거하십시오search_path. 기본 구성에서 쉽게 지원되는 몇 가지 사용 패턴이 있습니다.

  • 일반 사용자를 사용자-민간 토토 캔로 제한합니다. 이것을 구현하려면 exsu공개에서 토토 캔 대중에 대한 Revoke Create, 해당 사용자와 동일한 이름을 가진 각 사용자에 대한 토토 캔를 만듭니다. 기본 검색 경로는로 시작한다는 것을 상기하십시오.$ user, 사용자 이름으로 해결됩니다. 따라서 각 사용자에게 별도의 토토 캔가있는 경우 기본적으로 자체 토토 캔에 액세스합니다. 신뢰할 수없는 사용자가 이미 로그인 한 데이터베이스 에서이 패턴을 채택한 후 토토 캔의 개체와 같은 객체에 대한 공개 토토 캔 감사를 고려하십시오PG_CATALOG. 이 패턴은 신뢰할 수없는 사용자가 데이터베이스 소유자이거나 보유하지 않는 한 보안 토토 캔 사용 패턴입니다.Createrole권한,이 경우 보안 토토 캔 사용 패턴이 존재하지 않습니다.

  • 기본 검색 경로에서 공개 토토 캔를 제거하여 수정하여postgresql.conf또는 발행ALTER 역할 ALLER SETOR SEARCH_PATH = "$ USER". 모든 사람은 공개 토토 캔에서 객체를 만들 수있는 기능을 유지하지만 자격을 갖춘 이름 만 해당 객체를 선택합니다. 자격을 갖춘 테이블 참조는 괜찮지 만 공개 토토 캔의 기능에 대한 호출안전하지 않거나 신뢰할 수 없습니다. 공개 토토 캔에서 함수 또는 확장을 만드는 경우 첫 번째 패턴을 대신 사용하십시오. 그렇지 않으면, 첫 번째 패턴과 마찬가지로, 신뢰할 수없는 사용자가 데이터베이스 소유자이거나 보유하지 않는 한 이것은 안전합니다.Createrole특권.

  • 기본값을 유지하십시오. 모든 사용자는 공개 토토 캔에 암시 적으로 액세스합니다. 이것은 토토 캔를 전혀 사용할 수없는 상황을 시뮬레이션하여 비 토토 캔 인식 세계에서 원활한 전환을 제공합니다. 그러나 이것은 결코 안전한 패턴이 아닙니다. 데이터베이스에 단일 사용자 또는 상호 신뢰 사용자가 몇 명있는 경우에만 허용됩니다.

모든 패턴의 경우 공유 애플리케이션 (모든 사람이 사용할 테이블, 타사가 제공하는 추가 기능 등)을 설치하려면 별도의 토토 캔에 넣습니다. 다른 사용자가 액세스 할 수 있도록 적절한 권한을 부여해야합니다. 그런 다음 사용자는 토토 캔 이름으로 이름을 자격하여 이러한 추가 객체를 참조하거나 선택한대로 추가 토토 캔를 검색 경로에 넣을 수 있습니다..

5.8.7. 이식성

SQL 표준에서는 다른 사용자가 소유 한 동일한 토토 캔의 객체 개념이 존재하지 않습니다. 또한 일부 구현은 소유자와 다른 이름을 가진 토토 캔를 만들 수 없습니다. 실제로, 토토 캔 및 사용자의 개념은 표준에 지정된 기본 토토 캔 지원만을 구현하는 데이터베이스 시스템에서 거의 동일합니다. 따라서 많은 사용자가 자격을 갖춘 이름을 실제로 구성한다고 생각합니다.user_name.table_name. 이것은 방법입니다PostgreSQL모든 사용자를위한 사용자 마당 토토 캔를 만들면 효과적으로 행동합니다.

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

물론 일부 SQL 데이터베이스 시스템은 Schemas를 전혀 구현하지 못하거나 (제한된) 교차-데이터베이스 액세스를 허용함으로써 네임 스페이스 지원을 제공 할 수 있습니다. 해당 시스템으로 작업 해야하는 경우 토토 캔를 전혀 사용하지 않음으로써 최대의 휴대 성을 달성합니다.