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 OID
ist also nicht gut für den Anwendungsfall!
In einigen Datenbanken habe ich eine separate login
Tabelle 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_id
an 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 ...