Wie können Sie im Derby-Server die Informationen in den Systemtabellen des Schemas verwenden, um eine SELECT-Anweisung zu erstellen, um die Abhängigkeitsnamen für jede Tabelle abzurufen?Derby - Einschränkungen
Antwort
Das entsprechende Handbuch ist die Derby Reference Manual. Es gibt viele Versionen verfügbar: 10.13 war Strom im April 2017, aber es war 10.3 im Mai 2009
Ursprüngliche Antwort
SELECT c.constraintname, t.tablename
FROM sysconstraints c, systables t
WHERE c.tableid = t.tableid;
Seit ausreichend aktuelle Versionen von Derby verlangen, dass die Systemkatalogtabellen Präfix von sys.
(10.13 von kiwicomb123 in einem comment zitiert wird), können Sie die Abfrage revidieren die explizite JOIN Notation zu verwenden, und die Verwendung:
SELECT c.constraintname, t.tablename
FROM sys.sysconstraints c
JOIN sys.systables t
ON c.tableid = t.tableid;
Sie können zusätzliche Spalten hinzufügen, z. B. c.type
, um den Abhängigkeitstyp zu erhalten.
SELECT sc.schemaname, co.constraintname, t.tablename, cg.descriptor, t2.tablename, cg2.descriptor, f.deleterule, f.updaterule
FROM sys.sysconstraints co
JOIN sys.sysschemas sc ON co.schemaid = sc.schemaid
JOIN sys.systables t ON co.tableid = t.tableid
JOIN sys.sysforeignkeys f ON co.constraintid = f.constraintid
JOIN sys.sysconglomerates cg ON f.conglomerateid = cg.conglomerateid
JOIN sys.sysconstraints co2 ON f.keyconstraintid = co2.constraintid
JOIN sys.systables t2 ON co2.tableid = t2.tableid
JOIN sys.syskeys k ON co2.constraintid = k.constraintid
JOIN sys.sysconglomerates cg2 ON k.conglomerateid = cg2.conglomerateid
WHERE co.type = 'F'
and sc.schemaname = current schema
die beiden Deskriptoreinträge enthalten eine Liste von Spaltennummern für jede Tabelle, wie
BTREE (2,1)
wobei die Zahlen auf die Spaltennummern in der Tabelle entsprechen syscolumns für die entsprechende Tabelle.
Wenn jemand eine elegante Möglichkeit hat, dies in dieser Abfrage zu extrahieren, würde ich gerne wissen. Ich erhalte eine Liste aller Spalten für eine Tabelle in einer separaten Abfrage und extrahiere die Namen daraus, nachdem ich die Deskriptoren analysiert habe, um die Zahlen zu erhalten.
Gibt es auch eine Möglichkeit, den Constraint-Typ zu kennen? –
Ich denke, ich kann RTFM für Sie. Sysconstraints.Type ist ein CHAR (1) Feld, das einen der Werte 'U' (Unique), 'P' (Primary), 'F' (Fremdschlüssel) oder 'C' (Check) hat. Wenn Sie jedoch Hinweise auf die Dokumentation geben, ist es normalerweise sinnvoll, die Dokumentation zu lesen. –
Diese Abfrage funktioniert nicht in Derby 10.13. Sie müssen den Tabellennamen sysconstraints und sysconstraints den Präfix "sys." Zum Beispiel: Verwenden Sie sys.sysconstraints anstelle von sysconstraints. – kiwicomb123