기존 권한을 가진 사용자를 신속하게 삭제하는 방법
작업 중인 앱에 대해 제한된 DB 사용자를 만들려고 하는데, 실험에 사용 중인 Postgres 데이터베이스 사용자를 삭제하려고 합니다.먼저 모든 권한을 수동으로 취소하거나 사용자가 가진 모든 권한을 취소하지 않고 사용자를 삭제할 수 있는 방법이 있습니까?
어때.
DROP USER <username>
이는 실제로 다음에 대한 별칭입니다.DROP ROLE
.
해당 사용자와 관련된 모든 권한을 명시적으로 삭제하고 소유권을 다른 역할로 이동하거나 개체를 삭제해야 합니다.
이는 다음을 통해 달성할 수 있습니다.
REASSIGN OWNED BY <olduser> TO <newuser>
그리고.
DROP OWNED BY <olduser>
후자는 사용자에게 부여된 모든 권한을 제거합니다.
DROP ROLE에 대한 자세한 설명은 포스트그레스 문서를 참조하십시오.
추가:
여기에 언급된 명령을 사용하여 사용자를 삭제하려는 시도는 여기에서 설명한 것처럼 원래 GRANT가 만들어진 동일한 데이터베이스에 연결된 상태에서 해당 명령을 실행하는 경우에만 작동합니다.
승인된 답변으로 인해 소유자 재할당 또는 소유자 삭제를 시도할 때 오류가 발생했습니다.다음은 저에게 효과가 있었습니다.
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;
사용자는 다른 스키마에서 권한을 가질 수 있으며, 이 경우 올바른 스키마로 대체된 "공개"로 적절한 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%';
어떤 권한 유형이 TABLE, Sequence 또는 FUNCTION에서 해지하는 것에 해당하는지는 잘 모르겠지만, 모두 세 가지 중 하나에 해당한다고 생각합니다.
마침내 저에게 도움이 된 것은 다음과 같습니다.
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 ;
또한 명시적으로 허용한 경우:
CONNECT ON DATABASE xxx TO GROUP
,
다음을 사용하여 Drop Owned BY와는 별도로 이를 취소해야 합니다.
REVOKE CONNECT ON DATABASE xxx FROM GROUP
이것은 저에게 효과가 있었습니다.
DROP OWNED BY dbuser
다음과 같은 경우:
DROP USER dbuser
한 줄 더 추가해서 취소해야 했어요...
실행 후:
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;
일부 개체에 종속되어 있기 때문에 사용자 이름을 삭제할 수 없습니다. 세부 정보: 스키마 공용에 대한 권한
나는 이것을 놓쳤습니다.
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";
이렇게 하면 됩니다.
REVOKE ALL ON SCHEMA public FROM myuser;
REVOKE ALL ON DATABASE mydb FROM myuser;
DROP USER myuser;
▁command다있니습▁in라는 명령어가 .dropuser
사용자를 postgres에서 삭제하는 데 사용할 수 있습니다.
$ dropuser someuser
https://dbtut.com/index.php/2018/07/09/role-x-cannot-be-dropped-because-some-objects-depend-on-it/
확인해보니 db에 어떤 객체에 대한 소유권이 없었고 나중에 사용자와 허가 권한을 위해 만들어진 외부 데이터 래퍼 매핑 때문일 수도 있다는 것을 깨달았습니다.
그래서 두 가지 조치가 필요했습니다.
- 사용자 매핑 삭제
- 외부 데이터 래퍼의 사용을 취소합니다.
샘플 쿼리
사용자 이름 서버 외부 서버 이름에 대한 사용자 매핑 삭제
외부 서버의 모든 외부 서버 이름을 사용자 이름에서 해지합니다.
Postgres 문서에는 이에 대한 명확한 답변이 있습니다. 이 답변은 승인된 유일한 답변입니다.
REASSIGN OWNED BY doomed_role TO successor_role;
DROP OWNED BY doomed_role;
-- repeat the above commands in each database of the cluster
DROP ROLE doomed_role;
핵심 사항:
-- repeat the above commands in each database of the cluster
"it's typically necessary to run both REASSIGN OWNED and DROP OWNED (in that order!) to fully remove the dependencies of a role to be dropped."
저는 같은 문제에 직면했고 이제 그것을 해결할 방법을 찾았습니다.먼저 삭제할 사용자의 데이터베이스를 삭제해야 합니다.그러면 사용자를 쉽게 삭제할 수 있습니다.
저는 "msf"라는 사용자를 만들었고 사용자를 삭제하고 다시 만들기 위해 잠시 애를 먹었습니다.저는 아래 단계를 따라 성공했습니다.
데이터베이스 삭제
dropdb msf
사용자 삭제
dropuser msf
이제 사용자를 성공적으로 삭제했습니다.
언급URL : https://stackoverflow.com/questions/3023583/how-to-quickly-drop-a-user-with-existing-privileges
'programing' 카테고리의 다른 글
git에서 태그 간 커밋 목록 가져오기 (0) | 2023.05.10 |
---|---|
[알림]이란 무엇입니까?속성 변경됨INOTIFY를 구현하는 경우 C#에서 Invocator]속성이 변경되었습니까? (0) | 2023.05.10 |
개체가 특정 유형인지 확인하는 방법 (0) | 2023.05.10 |
Git에 "합병되지 않은 파일이 있으므로 꺼내기가 불가능합니다"라고 표시되는 이유는 무엇입니까? (0) | 2023.05.10 |
다음을 클릭한 후 알림 제거 (0) | 2023.05.05 |