Co powiesz na
DROP USER <username>
W rzeczywistości jest to alias dla DROP ROLE
.
Musisz w sposób bezpośredni zrezygnować z wszelkich uprawnień związanych z tym użytkownikiem, a także przenieść jego własność na inne role (lub porzucić obiekt).
Najlepiej to osiągnąć przez
REASSIGN OWNED BY <olduser> TO <newuser>
i
DROP OWNED BY <olduser>
Ten ostatni usunie wszelkie uprawnienia nadane użytkownikowi.
Zobacz dokumentację postgres dla DROP ROLE i bardziej szczegółowy opis tego.
Dodanie:
Najwyraźniej próba usunięcia użytkownika za pomocą poleceń wymienionych tutaj będzie działać tylko wtedy, gdy wykonujesz je będąc połączonym z tą samą bazą danych, z której utworzono oryginalne GRANTS, jak omówiono tutaj:
https://www.postgresql.org/message-id/83894A1821034948BA27FE4DAA47427928F7C29922%40apde03.APD.Satcom.Local
CREATE TABLE foo(bar SERIAL); ALTER TABLE foo OWNER TO postgres; CREATE USER testuser; GRANT ALL ON foo TO testuser; DROP USER testuser
dał komunikaty o błędach:ERROR: role "testuser" cannot be dropped because some objects depend on it DETAIL: access to table foo
. JednakDROP OWNED BY testuser
załatwił sprawę, najwyraźniej Postgres uważa granty za przedmioty, które można upuszczać.Zaakceptowana odpowiedź zakończyła się dla mnie błędami podczas próby ponownego PRZYDZIELENIA WŁASNOŚCI PRZEZ lub UPUSZCZENIA WŁASNOŚCI PRZEZ. Pracowały dla mnie:
Użytkownik może mieć uprawnienia w innych schematach, w takim przypadku będziesz musiał uruchomić odpowiednią linię REVOKE z „public” zastąpionym przez prawidłowy schemat. Aby wyświetlić wszystkie schematy i typy uprawnień dla użytkownika, zmodyfikowałem polecenie \ dp, aby wykonać następujące zapytanie:
Nie jestem pewien, które typy uprawnień odpowiadają odwołaniu TABEL, SEKWENCJI lub FUNKCJI, ale myślę, że wszystkie należą do jednego z trzech.
źródło
REVOKE ALL PRIVILEGES ON DATABASE db_name FROM username;
revoke USAGE on SCHEMA some_schema from username;
Zwróć również uwagę, jeśli wyraźnie wyraziłeś zgodę:
CONNECT ON DATABASE xxx TO GROUP
,musisz to odwołać niezależnie od DROP OWNED BY, używając:
REVOKE CONNECT ON DATABASE xxx FROM GROUP
źródło
Musiałem dodać jeszcze jedną linię do REVOKE ...
Po bieganiu:
Nadal otrzymuję błąd: nazwa użytkownika nie może zostać usunięta, ponieważ niektóre obiekty są od niej zależne SZCZEGÓŁY: uprawnienia dla schematu publiczny
Brakowało mi tego:
Wtedy mogłem zrezygnować z tej roli.
źródło
Oto, co w końcu zadziałało:
źródło
Nie ma
REVOKE ALL PRIVILEGES ON ALL VIEWS
, więc skończyłem na:i zwykle:
aby odniosły sukces:
źródło
W linii poleceń dostępne jest polecenie
dropuser
upuszczenia użytkownika z postgres.źródło
Zmierzyłem się z tym samym problemem i teraz znalazłem sposób na jego rozwiązanie. Najpierw musisz usunąć bazę danych użytkownika, którego chcesz usunąć. Następnie użytkownika można łatwo usunąć.
Utworzyłem użytkownika o nazwie „msf” i przez chwilę walczyłem, aby go usunąć i odtworzyć. Wykonałem poniższe kroki i udało mi się.
1) Usuń bazę danych
2) upuść użytkownika
Teraz pomyślnie usunąłem użytkownika.
źródło