답변:
어때
DROP USER <username>
이것은 실제로 DROP ROLE
.
해당 사용자와 관련된 모든 권한을 명시 적으로 삭제하고 소유권을 다른 역할로 이동 (또는 개체 삭제)해야합니다.
이것은 다음에 의해 가장 잘 달성됩니다.
REASSIGN OWNED BY <olduser> TO <newuser>
과
DROP OWNED BY <olduser>
후자는 사용자에게 부여 된 모든 권한을 제거합니다.
DROP ROLE에 대한 postgres 문서 와 이에 대한 자세한 설명 을 참조하십시오.
덧셈:
분명히 여기에 언급 된 명령을 사용하여 사용자를 삭제하려는 시도는 여기에 설명 된대로 원래 GRANTS가 만들어진 동일한 데이터베이스에 연결되어있는 동안 실행하는 경우에만 작동합니다.
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에 대한 취소에 해당하는 권한 유형이 무엇인지 확실하지 않지만 모두 세 가지 중 하나에 해당한다고 생각합니다.
REVOKE ALL PRIVILEGES ON DATABASE db_name FROM username;
revoke USAGE on SCHEMA some_schema from username;
또한 다음을 명시 적으로 부여한 경우에도 유의하십시오.
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";
나는 같은 문제에 직면했고 이제 그것을 해결할 방법을 찾았습니다. 먼저 삭제하려는 사용자의 데이터베이스를 삭제해야합니다. 그러면 사용자를 쉽게 삭제할 수 있습니다.
"msf"라는 사용자를 만들고 사용자를 삭제하고 다시 만드는 데 한동안 고생했습니다. 나는 아래 단계를 따랐고 성공했습니다.
1) 데이터베이스 삭제
dropdb msf
2) 사용자 삭제
dropuser msf
이제 사용자가 성공적으로 삭제되었습니다.
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가 보조금을 드롭 가능한 객체로 간주합니다.