PostgreSQL 역할에 연결된 객체 찾기


12

얼마 전에 user1 (PostgreSQL 9.4.9) 이라는 PostgreSQL 사용자를 만들었습니다 .

이 사용자를 삭제하고 싶습니다. 따라서 먼저 테이블, 시퀀스, 함수, 기본 권한 및 소유권에 대한 모든 권한을 취소합니다.

ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON SEQUENCES FROM user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON TABLES FROM user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE ALL ON FUNCTIONS FROM user1;

REVOKE ALL ON ALL SEQUENCES IN SCHEMA public FROM user1;
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM user1;
REVOKE ALL ON ALL FUNCTIONS IN SCHEMA public FROM user1;

REASSIGN OWNED BY user1 TO postgres;

그러나 하나의 객체가 2 개의 데이터베이스에서이 사용자와 연결된 상태 인 것 같습니다.

postgres=# DROP ROLE user1;
ERROR:  role "user1" cannot be dropped because some objects depend on it
DETAIL:  1 object in database db1
1 object in database db2

심지어 함수 인 것 같습니다.

postgres=# \c db1
You are now connected to database "db1" as user "postgres".
db1=# DROP ROLE user1;
ERROR:  role "user1" cannot be dropped because some objects depend on it
DETAIL:  privileges for function text(boolean)
1 object in database db2

그러나 소유하거나 user1과 관련된 객체를 확인할 수 없습니다.

내가하면 pg_dump -s db1 | grep user1나는 어떤 결과를 얻을! 전역 객체 일 수 있습니까?

누락 된 개체를 어떻게 식별 할 수 있습니까?

각 데이터베이스 (db1 및 db2)에서 명령을 실행했습니다. 에서 소유 한 객체를 삭제하고 user1싶지 않고이 사용자에 대한 권한 부여를 다시 할당하거나 제거하고 싶습니다.

답변:


10

질문에 대한 답변

오류 메시지 및 소유자에서 기능을 찾으려면 다음을 수행하십시오.

SELECT oid::regprocedure AS function
     , pg_get_userbyid(proowner) AS owner
FROM   pg_proc
WHERE  oid = 'text(boolean)'::regprocedure;

관련 :

실제 문제

오류 메시지는 다음과 같습니다.

세부 사항 : 함수 텍스트 (부울)에 대한 권한

그건 하지 소유권에 대한 있지만에 대한 권한 .

에 대한 매뉴얼 DROP ROLE:

역할을 삭제하기 전에 자신이 소유 한 모든 개체를 삭제 (또는 소유권을 다시 할당) 하고 다른 개체에 대해 역할이 부여한 권한을 취소해야합니다 .

그리고위한 ALTER DEFAULT PRIVILEGES:

기본 권한이 변경된 역할을 삭제하려면 기본 권한의 변경 사항을 취소하거나 DROP OWNEDBY를 사용 하여 역할의 기본 권한 항목을 제거해야합니다 .

또한 REASSIGN OWNED하나의 DB 에서만 실행 된 것처럼 보이지만 매뉴얼은 다음을 지시합니다.

때문에 REASSIGN OWNED다른 데이터베이스 내의 개체에 영향을주지 않습니다,하는 것이 필요하다 각 데이터베이스에서이 명령을 실행 제거 할 수있는 역할이 소유 개체를 포함합니다.

대담한 강조 광산.

그리고 당신은로 명령을 제한했습니다 IN SCHEMA public. 전체 DB를 대상으로 해당 절을 삭제하십시오. 그러나 귀찮게하지 마십시오 ...

간단한 솔루션 DROP OWNED

REASSIGN OWNED BY user1 TO postgres;
DROP OWNED BY user1;

모든 역할의 객체 postgres는 첫 번째 명령으로 소유권을 변경 했으며 이제 안전합니다. 의 표현은 DROP OWNED이 모든 권한과 기본 권한을 제거 얻을 수 있기 때문에 조금, 오해의 소지가있다. 에 대한 매뉴얼 DROP OWNED:

DROP OWNED지정된 역할 중 하나가 소유 한 현재 데이터베이스 내의 모든 오브젝트를 삭제합니다. 현재 데이터베이스의 객체 및 공유 객체 (데이터베이스, 테이블 스페이스)에 대해 주어진 역할에 부여 된 모든 권한도 취소됩니다.

모든 관련 DB에서 반복하면 다음 킬로 이동할 수 있습니다.

DROP ROLE user1;

6

아래 쿼리에는 소유자가있는 개체가 나열되어 있습니다. 모든 특권에는 실제로 더 많은 것이 필요합니다.

--r = ordinary table, i = index, S = sequence, v = view, m = materialized view, c = composite type, t = TOAST table, f = foreign table
SELECT 
    n.nspname AS schema_name,
    c.relname AS rel_name,
    c.relkind AS rel_kind,
    pg_get_userbyid(c.relowner) AS owner_name
  FROM pg_class c
  JOIN pg_namespace n ON n.oid = c.relnamespace

UNION ALL

-- functions (or procedures)
SELECT
    n.nspname AS schema_name,
    p.proname,
    'p',
    pg_get_userbyid(p.proowner)
  FROM pg_proc p
  JOIN pg_namespace n ON n.oid = p.pronamespace

여전히이 누락 된 개체를 찾지 못했습니다.
Nicolas Payart

@NicolasPayart : 올바른 데이터베이스에서 쿼리를 실행하고 있습니까?
Erwin Brandstetter

1

먼저 데이터베이스에 연결해야합니다. 당신의 경우에

\c db1

\c db2

그런 다음 REVOKE ALL PRIVILEGES 및 REASSIGN OWNED / DROP OWNED 문을 다시 실행하십시오.


1
첫 답변에 감사합니다. 그러나 게시하기 전에 이것이 기존 답변에 추가되는 내용에 대해 생각하고 답변에 설명하십시오.
dezso 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.