PostgreSQL-기존 권한이있는 사용자를 빠르게 삭제하는 방법


122

작업중인 앱에 대해 제한된 DB 사용자를 만들려고하는데 실험에 사용중인 Postgres 데이터베이스 사용자를 삭제하고 싶습니다. 먼저 수동으로 모든 권한을 취소하지 않고 사용자를 삭제하거나 사용자가 가진 모든 권한을 취소 할 수있는 방법이 있습니까?

답변:


144

어때

DROP USER <username>

이것은 실제로 DROP ROLE.

해당 사용자와 관련된 모든 권한을 명시 적으로 삭제하고 소유권을 다른 역할로 이동 (또는 개체 삭제)해야합니다.

이것은 다음에 의해 가장 잘 달성됩니다.

REASSIGN OWNED BY <olduser> TO <newuser>

DROP OWNED BY <olduser>

후자는 사용자에게 부여 된 모든 권한을 제거합니다.

DROP ROLE에 대한 postgres 문서 와 이에 대한 자세한 설명 을 참조하십시오.


덧셈:

분명히 여기에 언급 된 명령을 사용하여 사용자를 삭제하려는 시도는 여기에 설명 된대로 원래 GRANTS가 만들어진 동일한 데이터베이스에 연결되어있는 동안 실행하는 경우에만 작동합니다.

https://www.postgresql.org/message-id/83894A1821034948BA27FE4DAA47427928F7C29922%40apde03.APD.Satcom.Local


11
수행 중 : CREATE TABLE foo(bar SERIAL); ALTER TABLE foo OWNER TO postgres; CREATE USER testuser; GRANT ALL ON foo TO testuser; DROP USER testuser 오류 메시지가 표시 ERROR: role "testuser" cannot be dropped because some objects depend on it DETAIL: access to table foo되었습니다.. 그러나 DROP OWNED BY testuser트릭은 Postgres가 보조금을 드롭 가능한 객체로 간주합니다.
millimoose

1
@Tim Kane과 millimoose를 명확히하십시오. 저는 FOO TO TESTUSER에 대한 SELECT를 부여한 다음 TESTUSER가 소유 한 DROP을 부여하면 원래 테이블이 삭제되는 것을 원하지 않습니다. DROP OWNED BY는 그랜트 만 드롭하고 그랜트가 만들어진 오브젝트는 드롭하지 않는다고 말하는 것 같습니다. 옳은?
Andrew Wolfe

1
Andrew, 설명을 위해 문서를 읽는 것이 가장 좋습니다. DROP OWNED BY 해당 사용자가 소유 한 테이블 삭제합니다. REASSIGN OWNED BY는 해당 테이블을 다른 사용자에게 재 할당합니다. 하나를 선택하십시오.
Tim Kane

3
여전히 권한이있는 상태에서 REASSIGN OWNED를 수행 한 후 너무 많이 제거하여 DROP OWNED가 걱정되는 경우 모든 [TABLES | SEQUENCES | ...] IN SCHEMA [schema name] FROM [role]
jla

실제로 DROP OWNED BY 명령은 그 의미와 효과가 약간 모호합니다. 나는 그것을 올바르게하기 위해 문서를주의 깊게 읽어야했다. 게시물들 주셔서 감사합니다.
Sébastien Clément

49

REASSIGN OWNED BY 또는 DROP OWNED BY를 시도 할 때 수락 된 답변으로 인해 오류가 발생했습니다. 다음은 나를 위해 일했습니다.

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM username;
DROP USER username;

사용자는 다른 스키마에서 권한을 가질 수 있습니다.이 경우 올바른 스키마로 "public"을 대체하여 적절한 REVOKE 라인을 실행해야합니다. 사용자의 모든 스키마와 권한 유형을 표시하기 위해 \ dp 명령을 편집하여 다음 쿼리를 작성했습니다.

SELECT 
  n.nspname as "Schema",
  CASE c.relkind 
    WHEN 'r' THEN 'table' 
    WHEN 'v' THEN 'view' 
    WHEN 'm' THEN 'materialized view' 
    WHEN 'S' THEN 'sequence' 
    WHEN 'f' THEN 'foreign table' 
  END as "Type"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE pg_catalog.array_to_string(c.relacl, E'\n') LIKE '%username%';

TABLES, SEQUENCES 또는 FUNCTIONS에 대한 취소에 해당하는 권한 유형이 무엇인지 확실하지 않지만 모두 세 가지 중 하나에 해당한다고 생각합니다.


12
나는 이것도 추가해야했다 :REVOKE ALL PRIVILEGES ON DATABASE db_name FROM username;
Wojciech Jakubas

3
또한 스키마 권한.
greatvovan

2
스키마 권한 :revoke USAGE on SCHEMA some_schema from username;
Alphaaa

나는 이것을 시도했지만 내 경우에는 문제가 지속됩니다. stackoverflow.com/questions/61168608/에
Andrus

17

또한 다음을 명시 적으로 부여한 경우에도 유의하십시오.

CONNECT ON DATABASE xxx TO GROUP ,

다음을 사용하여 DROP OWNED BY와 별도로이를 취소해야합니다.

REVOKE CONNECT ON DATABASE xxx FROM GROUP


나는 위의 모든 것을 시도했지만 조금 더 아래로 스크롤하기 전까지는 여전히 작동하지 않았으므로 이제 머리카락이 약간 남았습니다. 약간. : D 감사합니다 !!
Mitch Kent

6

REVOKE에 한 줄을 더 추가해야했습니다 ...

실행 후 :

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM username;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM username;

여전히 오류가 발생했습니다. 일부 개체가 사용자 이름에 의존하기 때문에 사용자 이름을 삭제할 수 없습니다. DETAIL : 스키마 공개 권한

나는 이것을 놓치고 있었다 :

REVOKE USAGE ON SCHEMA public FROM username;

그런 다음 역할을 그만 둘 수있었습니다.

DROP USER username;

예를 들어 pg_read_binary_file과 같은 기능에 대한 권한이있는 pg_rewind에 대한 사용자를 생성 한 경우 'SCHEMA pg_catalog'에 대한 권한을 취소해야 할 수도 있습니다.
GreenReaper

5

마침내 나를 위해 일한 것은 다음과 같습니다.

REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA myschem FROM user_mike;
REVOKE ALL PRIVILEGES ON SCHEMA myschem FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON SEQUENCES FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON TABLES FROM user_mike;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschem REVOKE ALL ON FUNCTIONS FROM user_mike;
REVOKE USAGE ON SCHEMA myschem FROM user_mike;
REASSIGN OWNED BY user_mike TO masteruser;
DROP USER user_mike ;

2

이 없으므로 다음으로 REVOKE ALL PRIVILEGES ON ALL VIEWS끝났습니다.

do $$
DECLARE r record;
begin
  for r in select * from pg_views where schemaname = 'myschem'
  loop
    execute 'revoke all on ' || quote_ident(r.schemaname) ||'.'|| quote_ident(r.viewname) || ' from "XUSER"';
  end loop;
end $$;

그리고 평소 :

REVOKE ALL PRIVILEGES ON DATABASE mydb FROM "XUSER";
REVOKE ALL PRIVILEGES ON SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA myschem FROM "XUSER";
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA myschem FROM "XUSER";

다음이 성공하려면 :

drop role "XUSER";

0

명령 줄에는 dropuserpostgres에서 사용자를 삭제 하는 데 사용할 수 있는 명령이 있습니다.

$ dropuser someuser

-19

나는 같은 문제에 직면했고 이제 그것을 해결할 방법을 찾았습니다. 먼저 삭제하려는 사용자의 데이터베이스를 삭제해야합니다. 그러면 사용자를 쉽게 삭제할 수 있습니다.

"msf"라는 사용자를 만들고 사용자를 삭제하고 다시 만드는 데 한동안 고생했습니다. 나는 아래 단계를 따랐고 성공했습니다.

1) 데이터베이스 삭제

dropdb msf

2) 사용자 삭제

dropuser msf

이제 사용자가 성공적으로 삭제되었습니다.


2
이것은 믿을 수 없을 정도로 슬래시 앤 번 방식입니다. 작업을 반복 할 때마다 데이터베이스 스키마를 다시 만들어야했기 때문입니다. (어떤 기존 데이터베이스 스키마에 세분화 된 사용 권한을 가지고 참여;. 데이터베이스 스키마가 그대로 남아있는 경우, 즉 그것이 최선의 방법)
millimoose
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.