programing

Postgre를 삭제할 수 없습니다.SQL 역할입니다.오류: "일부 개체가 종속되어 있으므로 삭제할 수 없습니다."

closeapi 2023. 5. 6. 15:00
반응형

Postgre를 삭제할 수 없습니다.SQL 역할입니다.오류: "일부 개체가 종속되어 있으므로 삭제할 수 없습니다."

저는 Postgre를 삭제하려고 했습니다.SQL 사용자:

DROP USER ryan;

다음 오류가 발생했습니다.

Error in query:
ERROR: role "ryan" cannot be dropped because some objects depend on it
DETAIL: privileges for database mydatabase

저는 다음 스레드에서 솔루션을 찾았습니다.

여전히 동일한 오류가 있습니다.

사용자 "ryan"에게 다음과 같은 모든 권한을 부여한 후에 이 문제가 발생합니다.

GRANT ALL PRIVILEGES ON DATABASE mydatabase ON SCHEMA public TO ryan;

DROP USER 역할이 다른 개체를 소유하거나 다른 개체에 대해 부여된 권한을 가지고 있는 동안에는 계속할 수 없습니다.

모든 권한을 제거합니다(문법에서 너무 명확하지 않음).설명서:

[...] 현재 데이터베이스의 개체 및 공유 개체(데이터베이스, 테이블스페이스)에 대해 지정된 역할에 부여된 모든 권한도 취소됩니다.

따라서 역할을 삭제할 수 있는 신뢰할 수 있는 일련의 명령은 다음과 같습니다.

REASSIGN OWNED BY ryan TO postgres;  -- or some other trusted role
DROP OWNED BY ryan;

역할이 소유하거나 권한이 있는 동일한 클러스터의 모든 데이터베이스에서 두 명령을 실행합니다!
그리고 마지막으로:

DROP USER ryan;
  • REASSIGN OWNED 역할이 현재 소유하고 있는 모든 개체의 소유권을 변경합니다.
  • DROP OWNED 그런 다음 권한만 취소합니다(소유권은 제외).

또는 생략할 수 있습니다.REASSIGN OWNED.그리고나서DROP OWNED(또한) 사용자가 소유한 모든 개체를 삭제합니다. (확실합니까?!)

관련:

저에게 효과가 있었던 것은 다음과 같은 단계를 따르는 것이었습니다.

  1. 데이터베이스에 연결하는 중
\c mydatabase
  1. 소유권 재할당
REASSIGN OWNED BY ryan TO <newuser>;

또는 개체를 삭제하는 중입니다.

DROP OWNED BY ryan;
  1. 실행 중REVOKE PRIVILEGES
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM ryan;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM ryan;
REVOKE ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public FROM ryan;
  1. 사용자 삭제
DROP USER ryan;

PS: 2단계와 3단계를 모두 실행할 필요가 없을 수도 있습니다. 일반적으로 두 단계 중 하나만 실행해도 충분합니다.

RDS Postgres 13에서 도움이 된 내용:

REVOKE ALL PRIVILEGES ON DATABASE <my_db> FROM <my_user>;

또한 역할이 테이블 소유자여서 삭제할 수 없는 유사한 오류가 발생하여 테이블 소유자를 다시 할당해야 했습니다.

ALTER TABLE <my_table> OWNER TO <trusted_role>;

AWS가 마스터 사용자에게 완전한 슈퍼유저를 제공하지 않기 때문에 RDS에서 이와 같은 재할당을 수행하는 것은 저에게 적합하지 않았습니다.REASSIGN OWNED BY <olduser> TO <newuser>;

REVOKE ALL ON SCHEMA "public" FROM "<user>";

나를 위해 일했습니다.

제게 효과가 있었던 것은template1데이터베이스를 선택한 다음 일부 역할을 삭제합니다.

$ psql -U postgres postgres
postgres=# update pg_database set datistemplate = false where datname='template1';
UPDATE 1
postgres=# drop database template1;
DROP DATABASE
postgres=# create database template1 template=template0;
CREATE DATABASE
postgres=# update pg_database set datistemplate = true where datname='template1';
UPDATE 1
postgres=# DROP ROLE test;
DROP ROLE

AWS Postgresql RDS를 사용하는 사용자는 다음을 시도할 수 있습니다.

  1. postgres 사용자에 로그인한 다음 소유자 권한 부여
postgres=> GRANT target_user to old_user;
GRANT ROLE
  1. 제거할 사용자(old_user)를 사용하여 대상 DB에 로그인한 다음 재할당
target_db=> REASSIGN OWNED BY old_user TO target_user;
REASSIGN OWNED
  1. postgres 사용자에 다시 로그인하고 모든 권한을 취소한 후 사용자 삭제
postgres=> REVOKE ALL PRIVILEGES ON DATABASE target_db FROM old_user;
REVOKE
postgres=> DROP USER old_user;
DROP ROLE

https://aws.amazon.com/premiumsupport/knowledge-center/rds-postgresql-drop-user-role/ 참조

언급URL : https://stackoverflow.com/questions/51256454/cannot-drop-postgresql-role-error-cannot-be-dropped-because-some-objects-depe

반응형