ALTER mehrere superuser zu nosuperuser

Hallo zusammen,

mit folgendem Befehl kann ich mir alle User ausgeben, die superuser sind:

SELECT usename FROM pg_user WHERE superuser = true AND usename != ‘postgres’;

Wenn ich nun im Umkehrschluss einen superuser zu einem NICHT-superuser ändern will, kann ich dies einfach mit ALTER ROLE tun.

ALTER ROLE <role> WITH NOSUPERUSER;

Hier muss ich dann für jede role einzeln eingeben und ausführen.
Gibt es die Möglichkeit beide SQL-Queries miteinander zu kombinieren, so dass ich ein Befehl für alle superuser ausführen kann?

Hab gesucht, jedoch nichts finden können. Bei zwei SELECT Anweisungen könnte man ein Join durchführen. Wie verhält es sich aber bei einem ALTER ROLE?

Danke im Voraus und LG

aus dem Bauch heraus würde ich raten, entweder ‘außen herum’ die ALTER - Statements zu erstellen oder dafür eine SP zu schreiben.

Danke für die Antwort. Hmm… also kann ich das nicht einfach über einem befehl in der Console ausführen?!

Doch mit einem kleinen PL/pgSQL block:

do
$$
declare
  l_rec record;
begin
  for l_rec in (select usename 
                from pg_user 
                where usesuper
                  and usename <> 'postgres'
                  and usename <> current_user) loop
                
     execute format('alter user %I with nosuperuser', l_rec.usename);
  end loop;
end;
$$;

Vielen Dank @castorp.

Schaut gut aus. Ich kenn mich leider nicht sonderlich gut mit Functions und Procedualen Languages aus. Wenn ich dein Code 1:1 im Terminal ausführe geht leider Garnichts.

Oops - da fehlt ein ; ganz am Ende (also nach dem $$), sorry.

Vielen Dank. Hat funktioniert :slight_smile: