Der schnellste Weg, um die OID des aktuellen Benutzers in Postgres zu erhalten?

7

Ich denke darüber nach, die OID des Benutzers in der Spalte "Eigentümer" einer Tabelle zu speichern, damit ich nichts tun muss, wenn sie ihren Benutzernamen ändern.

Ich verstehe, dass man pg_has_role () mit OIDs verwenden kann, also ist das gut.

Gibt es eine schnelle und einfache Möglichkeit, die OID des aktuellen Benutzers abzurufen, ohne sie nur mit einer der Systemtabellen abzugleichen?

Neil McGuigan
quelle

Antworten:

11

Der schnellste mir bekannte Weg ist eine Suche in der Systemkatalogansicht pg_roles:

SELECT * FROM pg_roles WHERE rolname = 'postgres';

Genau genommen wäre es sogar etwas schneller, die zugrunde liegende Tabelle zu verwenden pg_authid, aber der Zugriff darauf ist aus guten Gründen auf Superuser beschränkt.

Es gibt keinen Objektkennungstyp wie für Tabellen oder Typen, der eine einfache Umwandlung wie ermöglichen würde 'mytable'::regclass.

Beachten Sie jedoch, dass OIDs während eines Dump- / Wiederherstellungszyklus nicht stabil sind. Das OIDist also nicht gut für den Anwendungsfall!

In einigen Datenbanken habe ich eine separate loginTabelle mit einem seriellen Primärschlüssel, die ich für ähnliche Zwecke verwende. Manuell gepflegt. Und Funktionen, die es verwenden, sind darauf vorbereitet, gelegentlich keinen Benutzer in dieser Tabelle zu finden. Ein sehr einfacher und schneller Tisch:

CREATE TABLE users.login (
  login_id serial PRIMARY KEY 
 ,username text NOT NULL UNIQUE
);

Beim Erstellen neuer Benutzer verwende ich eine plpgsql-Funktion, die den neuen Benutzer im System erstellt und gleichzeitig in meine Tabelle eingibt. Und ich benutze dies login_idan vielen Orten . Zum Beispiel verfolge ich, wer in den meisten Tabellen die letzte Änderung an einer Zeile vorgenommen hat. Ich benutze diese einfache Funktion:

CREATE OR REPLACE FUNCTION public.f_login_id()
  RETURNS int AS
$func$
SELECT COALESCE((SELECT login_id FROM users.login
                 WHERE  username = session_user::text), 0::int)
$func$ LANGUAGE sql STABLE;

Keine Fremdschlüsseleinschränkungen, um die Dinge schnell und einfach zu halten. Natürlich brauche ich keine strikte referenzielle Integrität ...

Erwin Brandstetter
quelle
Verdammt. Trotzdem danke. Können Sie Ihre Anmeldetabelle / Ihr Anmeldesystem ein wenig beschreiben?
Neil McGuigan
1
@NeilMcGuigan: Ich habe das Grundlayout meines sehr einfachen Designs hinzugefügt.
Erwin Brandstetter