IT story

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

hot-time 2020. 8. 6. 07:50
반응형

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 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";

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

I created an user named "msf" and struggled a while to delete the user and recreate it. I followed the below steps and Got succeeded.

1) Drop the database

dropdb msf

2) drop the user

dropuser msf

Now I got the user successfully dropped.

참고URL : https://stackoverflow.com/questions/3023583/postgresql-how-to-quickly-drop-a-user-with-existing-privileges

반응형