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

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



답변

어때

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


답변

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에 대한 취소에 해당하는 권한 유형이 무엇인지 확실하지 않지만 모두 세 가지 중 하나에 해당한다고 생각합니다.


답변

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

CONNECT ON DATABASE xxx TO GROUP ,

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

REVOKE CONNECT ON DATABASE xxx FROM GROUP


답변

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;


답변

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

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 ;


답변

이 없으므로 다음으로 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";


답변

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

$ dropuser someuser