오류 : 생성 할 스키마가 선택되지 않았습니다.


38

공개 스키마에 문제가 있음을 알고있는 Amazon RDS postgresql 데이터베이스에서 작업하고 있습니다 (삭제되었을 수도 있음). 그러나 분명히 스키마가 존재하고 어쨌든 문제는 해결되지 않습니다. 다음은 새로 작성된 빈 데이터베이스가있는 샘플 세션입니다.

mydb=> CREATE TABLE distributors (
mydb(>     did     integer,
mydb(>     name    varchar(40) UNIQUE
mydb(> );
ERROR:  no schema has been selected to create in
mydb=> show search_path;
  search_path   
----------------
 "$user",public
(1 row)

mydb=> create schema public;
ERROR:  schema "public" already exists

힌트가 있습니까? 무엇을 찾아야합니까?

해결되었습니다. Daniel Vérité의 답변 덕분에 다음을 통해 해결했습니다.

grant usage on schema public to public;
grant create on schema public to public;

공용 스키마에 대한 기본 권한입니까?

데이터베이스에 액세스 할 수있는 단일 사용자가 있으므로 보안 위험이 발생할 수 없습니다 ...

template1 에서 동일한 수정을해야한다고 생각합니다 . 맞습니까? template1의 권한 (예 : 기본값)이 올바른지 어떻게 확인할 수 있습니까?


3
사용자에게 퍼블릭 스키마에서 테이블을 생성하는 데 필요한 권한이 없을 수 있습니다.
a_horse_with_no_name

편집 후 : 예, template1에 연결하고 스키마 권한을 확인하십시오 (편집 된 답변 참조).
Daniel Vérité

답변:


34

USAGE의 스키마에 대한 권한 이없는 경우에 발생합니다 search_path. 기본적으로 의사 역할 public(모든 사용자)은 public스키마 에 대해이 권한을 가지 므로이 오류는 다음을 사용하여 명시 적으로 취소 한 후에 만 ​​발생합니다.

revoke usage on schema public from public;

이는 테이블에서 데이터를 선택하지 않아도 (다른 권한을 통해 부여되는) 사람들이 다른 사람 스키마를 들여다 보지 않는 경우에 필요합니다.

REVOKE해당 데이터베이스 에서이 작업을 수행하지 않은 경우 새 데이터베이스가 모델링되는 템플릿 데이터베이스에서 발생했을 수 있습니다 (참조 CREATE DATABASE).


사용자에게 USAGE권한이 있지만 CREATE스키마에 대한 권한 이없는 경우 객체를 만들 때 다른 오류가 발생합니다. schema public에 대한 권한이 거부되었습니다 .

psql 내부의 권한을 확인하려면을 사용하십시오 \dn+ public.

기본적으로 ( \x가독성을 위해 확장 디스플레이 로 표시됨) :

# \ dn + 공개
스키마 목록
-[녹음 1] ----- + -----------------------
이름 | 공공의
소유자 | postgres
액세스 권한 | postgres = UC / 포스트그레스
                  | = UC / 포스트그레스
설명 | 표준 공개 스키마

역할 이름이 부족하다는 것은 =모든 역할에 해당함을 의미합니다 (= 공개)

공개 USAGE 권한이없는 경우

이름 | 공공의
소유자 | postgres
액세스 권한 | postgres = UC / 포스트그레스
                  | = C / 포스트그레스
설명 | 표준 공개 스키마

공용 USAGE 또는 CREATE 권한이없는 경우

이름 | 공공의
소유자 | postgres
액세스 권한 | postgres = UC / 포스트그레스
설명 | 표준 공개 스키마

고마워요! (질문에 메모를 작성하겠습니다).
Emanuele Paolini

3

사용자 정의 스키마에서 함수를 생성하는 pgdump 파일이 있었고 사용자 정의 스키마 이름을 일반 공개로 전환하고 모든 스키마를 기존 스키마로 비우고 (예 : myschema.tablename to tablename) 오류를 받기 시작했습니다.

ERROR:  no schema has been selected to create in

내 경우 오류는 현재 줄의 시작 부분에서 발생합니다

SELECT pg_catalog.set_config('search_path', '', false);

두 번째 인수를 '공개'로 변경했습니다.

SELECT pg_catalog.set_config('search_path', 'public', false);

그리고 문제는 사라졌다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.