Benutzte Referenz eines Foreign-key prüfen

Hallo zusammen!

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?

Gruß
MickeyMaus91

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.

Andreas

Hallo,

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.

Gruß
mickeymaus91

Wir haben Transaktionen. Setze einen Savepoint und fahre zu diesem zurück.

Andreas

Ok. Stimmt das ginge, könnte danach einen Rollback machen.

Falls doch noch jemand eine Befehl kennt mit dem das geht, immer her damit.

Nur so ein Gedanke: Der PGAdminIII kann doch die DB auch analysieren und solche Datensätze aufspüren. Wie macht der das denn?

Wenn das so ist, ist die Lösung einfach: logge die Statements, die PGAdmin absetzt.


Andreas

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.

Andreas

pg_depend ist auch dabei akretschmer :slight_smile:

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 :slight_smile:

Gruß shinchan

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” :smiley: :smiley: