Ich habe eine Tabelle A die von vielen verschiedenen Tabellen in der DB referenziert wird. Ich möchte gerne prüfen ob ein Eintrag in Tabelle A schon mit irgendeiner dieser Tabellen verknüpft ist oder noch nicht.
Gibt es dafür einen Befehl?
Vermutlich nicht direkt. Du kannst versuchen, einen Eintrag zu löschen. Falls es einen Fehler gibt, dann wird er referenziert.
Das kanst Du in einer function machen und den Error abfangen, damit es Dir keine TX zerhaut.
das ist vermutlich nicht so eine gute Idee.
Denn wenn er noch nicht referenziert ist möchte ich ihn ja nicht löschen.
Ich möchte ja nur wissen ob er referenziert wird.
Btw.: man kan in pg_depend nachschauen, welche Abhängigkeiten bestehen. Dort kannst Du auch zählen, wieviel Tabellen auf die ref. Tabelle verweisen. Aber das geht nicht auf Record-Ebene hinab IIRC.
Ich denke was er sucht oder gesucht hat war etwas wie
SELECT DISTINCT w.oid, w.relname
FROM pg_class a, pg_depend d, pg_rewrite r, pg_class w
WHERE a.oid = d.refobjid
AND d.objid = r.oid
AND r.ev_class = w.oid
AND a.relname <> w.relname
AND a.oid = '12345'
Ersetze die oid und du kriegst für das objekt die abhängigen
Ui, der Tipp kann aber IMHO ins Auge gehen, wenn die FOREIGN KEYs die Eigenschaften ON DELETE CASCADE oder ON DELETE SET NULL oder ON DELETE NOACTION haben. Denn dann wird doch klaglos der Eintrag in der Tabelle A gelöscht, oder?
Klar … aber dann hat derjenige, der die Tabellen erstellt hat, das so gewollt und das zu verantworten. Wenn ich ein CASCADE da rein schreibe, dann muss ich auch damit rechnen, das da Daten rekursiv gelöscht werden. Die Datenbank kann nicht wissen, wie wichtig die Daten sind …
Aus dem Grund ist der Standardwert bei REFERENCES ja auch: “Schreie laut und brich mit einer Fehlermeldung ab”