주어진 데이터베이스와 사용자에 대한 search_path는 무엇입니까?


43

나는 현재 search_path로 볼 수 있습니다 :

show search_path ;

그리고 나는 현재 세션에search_path 대해 다음을 사용하여 설정할 수 있습니다 .

set search_path = "$user", public, postgis;

또한 search_path주어진 데이터베이스 에 대해 다음을 영구적으로 설정할 수 있습니다 .

alter database mydb set search_path = "$user", public, postgis ;

그리고 search_path주어진 역할 (사용자) 에 대해 다음 영구적으로 설정할 수 있습니다 .

alter role johnny set search_path = "$user", public, postgis ;

그러나 데이터베이스역할 설정 search_path을 변경하기 전에 (와 관련하여 ) 무엇을 결정하는 방법을 알고 싶습니다 .

답변:


36

카탈로그 테이블에서 역할 및 데이터베이스에 대한 구성 설정을 찾을 수 있습니다 pg_db_role_setting.

이 쿼리는 주어진 역할 또는 데이터베이스에 대한 모든 설정을 검색합니다.

SELECT r.rolname, d.datname, rs.setconfig
FROM   pg_db_role_setting rs
LEFT   JOIN pg_roles      r ON r.oid = rs.setrole
LEFT   JOIN pg_database   d ON d.oid = rs.setdatabase
WHERE  r.rolname = 'myrole' OR d.datname = 'mydb';

아무것도 설정하지 않으면, 다음으로 낮은 인스턴스의 기본 상태를 결정 search_path하고, postgresql.conf서버 시작시이 경우 또는 명령 줄 옵션에 있습니다. 관련 :

하려면 설정 해제 어떤 역할이나 데이터베이스의 설정 - search_path이 특정 예제를 :

ALTER ROLE myrole RESET search_path;

또는:

ALTER DATABASE mydb RESET search_path;

또는:

ALTER ROLE myrole in DATABASE mydb RESET search_path;

시스템 카탈로그 ( pg_catalog.*) 의 데이터를 수동으로 조작 하지 마십시오 . ALTER ROLE및 설명서에 지시 된대로 DDL 명령을 사용하십시오 ALTER DATABASE.
기본적으로이 RESET명령 pg_db_role_setting은 기본 설정이 다시 적용되도록 행을 삭제 합니다. 나는 그런 말을하지 않았다.


와. 나는 이것이 그렇게 복잡한 것이라고 상상하지 못했습니다. 당신은 어떻게 할 설정 해제 주어진 데이터베이스역할 설정을? 실행 후 (내 역할에 해당) 값이 alter role myrole set search_path = "$user", public, postgis ;있음을 알았 pg_roles.rolconfig습니다 {"search_path=\"$user\", public, postgis"}. 또한 select * from pg_db_role_setting ;이제 추가 행이 표시됩니다. 그리고 실행 후 alter database mydb set search_path = "$user", public, postgis ;해당 행이 표시 select * from pg_db_role_setting ;됩니다. 결국 이러한 변경 사항을 "실행 취소"하는 방법을 모르겠습니다.
user664833

@ user664833 : 설정을 해제하는 지침을 추가했습니다.
Erwin Brandstetter

6

데이터베이스 및 역할 모두에 대한 영구 설정은 pg_db_role_settings 시스템 클러스터 전체 테이블에 저장됩니다 .

변경된 설정 만 있습니다. 검색 경로가 데이터베이스 또는 역할에 대해 수정되지 않은 경우 다음과 같이 가정 할 수 있습니다 "$user",public.

  • 클러스터 레벨 (글로벌 구성을 통한)을 포함하여 변경하기 전의 설정 값은 다음 postgresql.conf을 사용하여 데이터베이스에서 조회 할 수 있습니다.

     SELECT boot_val FROM pg_settings WHERE name='search_path';
  • 세션 내 에서 SET명령을 통해 변경하기 전의 설정 값은 다음 을 사용하여 데이터베이스에서 쿼리 할 수 ​​있습니다.

     SELECT reset_val FROM pg_settings WHERE name='search_path';
  • 에 기본값이 아닌 값을 설정 하면 현재 세션과 독립적으로postgresql.conf SQL에서 해당 값을 얻는 것이 간단하지 않습니다 . 구성 파일의 변경 사항을 무시하기 때문에 수행 되지 않으며 잠재적으로 설정되는 데이터베이스 / 사용자 설정의 영향을 받기 때문에 수행되지 않습니다 . DBA가 가치를 얻는 가장 간단한 방법은에서 찾아 보는 것입니다 . 그렇지 않으면 이 주제를 자세히 다루는 search_path를 전역 클러스터 기본값으로 재설정을 참조하십시오 .pg_settings.boot_valpg_settings.reset_valALTER USER/ALTER DATABASEpostgresql.conf


하지가 boot_val실제로에서 컴파일 된 공장 기본이 아닌 설정 postgresql.conf?
Erwin Brandstetter

@ 어윈 : 예. reset_val대신에 보고 싶을 수도 있습니다 boot_val.
Daniel Vérité

흠, 데이터베이스 또는 역할 설정이의 값을 덮어 씁니다 reset_val. :이 최근의 연구이 오래된 질문을 우연히 발견 dba.stackexchange.com/questions/145280/...
어윈 Brandstetter

@ Erwin : ISTM postgresql.conf에서 값을 얻는 것이 대부분의 경우 XY 문제 일 가능성이 높습니다. 어쨌든, 나는 새로운 질문에 연결하고 조금 확장하기 위해 답변을 편집했습니다.
Daniel Vérité

3
select * from pg_user;

postgres 및 Redshift에 해당됩니다. 이에 따라 이전 응답에 비해 너무 간단 보인다 pg_db_role_setting, 그러나 useconfig열을 포함하여 사용자 CONFIGS의 목록 것 search_path목록으로 형식을.

pg_user Postgres 설명서가 여기 있습니다

더 선택적으로 :

rs.db.batarang.com cooldb:cooldude =#> select usename
                                              , useconfig 
                                       from   pg_user
                                       where  usename = 'cooldude';
┌────────────┬─────────────────────────────────────────────────────┐
  usename                         useconfig                      
├────────────┼─────────────────────────────────────────────────────┤
 cooldude    {"search_path=dirt, test, \"$user\", public, prod"} 
└────────────┴─────────────────────────────────────────────────────┘

이 사용자 테이블에는 특정 db뿐만 아니라 클러스터의 모든 사용자가 포함되어 있다고 생각하지만 확인하지는 못했습니다.


역할은 사용자와 정확히 동일하지 않습니다. ;)
Vic

빅 당신은 정교한 수 있습니까? Postgres 문서는 간결하며 사용자와 역할이 더 이상 구별되는 개념은 아니지만 DBA가 아니며 더 많은 의견을 원합니다. postgresql.org/docs/current/static/user-manag.html
멀린

2
모든 '역할'은 사용자, 그룹 또는 둘 다의 역할을 할 수 있습니다. 그러나 사용자는 하나의 다른 구별이 있음을 암시합니다. 카탈로그를 검토하면 pg_role 및 pg_user 뷰가 모두 pg_authid 테이블을 참조하지만 사용자에 대한 술어 rolcanlogin이있는 것을 알 수 있습니다. '사용자'는 데이터베이스에 로그인 할 수 있으며 일반적으로 '역할'은 사용자가 상속하는 권한 세트를 정의합니다.
Vic
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.