Wie identifiziere ich Tabellen, die einen Fremdschlüssel für eine bestimmte Tabelle in Sybase haben?

7

Ich suche (vorzugsweise) eine SQL-Anweisung, die die Tabellen- / und Spaltennamen für jede Tabelle mit einem Fremdschlüssel für eine bestimmte Tabelle in Sybase auswählt. Ich denke, es sollte irgendwie mit den sys...Tischen möglich sein, aber da ich für Sybase völlig neu bin, kann ich weder Kopf noch Fuß daraus machen. Daher wird jede Hilfe in die richtige Richtung sehr geschätzt.

Bearbeiten: Der Vollständigkeit halber: SELECT @@VERSIONkehrt zurück

'Adaptive Server Enterprise / 15.0.3 / EBF 17156 ESD # 3 / P / Sun_svr4 / OS 5.8 / ase1503 / 2726/64-Bit / FBO / Fr 5. Februar 05:26:23 2010'

Edit 2
Vielen Dank für Ihre Vorschläge, insbesondere für Andrew Bickertons Kommentar. Dadurch konnte ich eine rudimentäre SQL-Select-Anweisung erstellen, um einen weiteren Ausgangspunkt zu finden.

Falls sich jemand anderes dafür interessiert, hier ist es:

select 
  fko.name    "Foreign key name",
  par.name    "Referenced table name",
  fk1.name || ' -> ' || pk1.name "Reference 1",
  fk2.name || ' -> ' || pk2.name "Reference 2",
  fk3.name || ' -> ' || pk3.name "Reference 3",
  fk4.name || ' -> ' || pk4.name "Reference 4"
from 
  sysobjects      tab                                       join
  sysconstraints  con on tab.id        = con.tableid        join
  sysobjects      fko on con.constrid  = fko.id             join
  sysreferences   ref on con.constrid  = ref.constrid       join
  sysobjects      par on par.id        = ref.reftabid  left join
  ---- 1. Column
  syscolumns      fk1 on ref.fokey1    = fk1.colid and
                         ref.tableid   = fk1.id        left join
  syscolumns      pk1 on ref.refkey1   = pk1.colid and
                         ref.reftabid  = pk1.id        left join
  ---- 2. Column
  syscolumns      fk2 on ref.fokey2    = fk2.colid and
                         ref.tableid   = fk2.id        left join
  syscolumns      pk2 on ref.refkey2   = pk2.colid and
                         ref.reftabid  = pk2.id        left join
  ---- 3. Column
  syscolumns      fk3 on ref.fokey3    = fk3.colid and
                         ref.tableid   = fk3.id        left join
  syscolumns      pk3 on ref.refkey3   = pk3.colid and
                         ref.reftabid  = pk3.id        left join
  ---- 4. Column
  syscolumns      fk4 on ref.fokey4    = fk4.colid and
                         ref.tableid   = fk4.id        left join
  syscolumns      pk4 on ref.refkey4   = pk4.colid and
                         ref.reftabid  = pk4.id        -- Et cetera...
where
  tab.type = 'U'      and
  tab.name = 'tq84_f' and
  fko.type = 'RI'
René Nyffenegger
quelle
Prost auf das Hinzufügen zu Ihrem gelösten SQL! und gerne helfen, Sie in die richtige Richtung zu weisen :-)
Andrew Bickerton

Antworten:

4

Es ist schon eine Weile her, seit ich in Sybase gearbeitet habe, aber (aus dem Speicher) sollte die folgende SQL Sie in die richtige Richtung weisen:

select *
from sysobjects so inner join syscolumns sc on so.id = sc.id 
where sc.name = 'field name'

Sie können die Sybase-Bücher auch online lesen (Systemtabellen).

Andrew Bickerton
quelle
Da René die Tabellen / Spalten für Fremdschlüssel benötigt, braucht er sie nicht auch sysconstraintdort?
Jack sagt, versuchen Sie es mit topanswers.xyz
Nein, ich glaube nicht, dass es sysconstraint ist, ich denke, es sind sysreferences , die dann fokey1 bis fokey16 suchen
Andrew Bickerton
Ich
verstehe
@ JackPDouglas Es ist ein paar Jahre her, seit ich richtig in Sybase gespielt habe, konnte mich nicht erinnern, mit welchen Systemtabellen ich anfangen sollte :-)
Andrew Bickerton
2

Beachten Sie, dass der oben gezeigte Ansatz (unter Verwendung von Sysconstraints und Sysreferences) nur funktioniert, wenn Sie über eine referenzielle Einschränkung verfügen. Wenn Sie nur einen Fremdschlüssel definiert haben, dieser jedoch nicht eingeschränkt ist, wird er dort nicht angezeigt. Um alle Fremdschlüssel für eine bestimmte Tabelle abzurufen, können Sie syskeys verwenden:

select  rtrim(object_name(k.id)),
    rtrim(substring(col_name(k.depid, depkey1),sign(keycnt),30))
    +rtrim(substring(', '+col_name(k.depid, depkey2),sign(keycnt-1),30))
    +rtrim(substring(', '+col_name(k.depid, depkey3),sign(keycnt-2),30))
    +rtrim(substring(', '+col_name(k.depid, depkey4),sign(keycnt-3),30))
    +rtrim(substring(', '+col_name(k.depid, depkey5),sign(keycnt-4),30))
    +rtrim(substring(', '+col_name(k.depid, depkey6),sign(keycnt-5),30))
    +rtrim(substring(', '+col_name(k.depid, depkey7),sign(keycnt-6),30))
    +rtrim(substring(', '+col_name(k.depid, depkey8),sign(keycnt-7),30)),
    rtrim(substring(col_name(k.id, key1),sign(keycnt),30))
    +rtrim(substring(', '+col_name(k.id, key2),sign(keycnt-1),30))
    +rtrim(substring(', '+col_name(k.id, key3),sign(keycnt-2),30))
    +rtrim(substring(', '+col_name(k.id, key4),sign(keycnt-3),30))
    +rtrim(substring(', '+col_name(k.id, key5),sign(keycnt-4),30))
    +rtrim(substring(', '+col_name(k.id, key6),sign(keycnt-5),30))
    +rtrim(substring(', '+col_name(k.id, key7),sign(keycnt-6),30))
    +rtrim(substring(', '+col_name(k.id, key8),sign(keycnt-7),30))
from    syskeys k
where   k.type = 2
and     k.depid = object_id('report')

(Ersetzen Sie den Bericht durch den Namen Ihrer Tabelle).

Die erste Spaltenrückgabe ist der Name der Tabelle, wobei ein Fremdschlüssel auf diese Tabelle verweist. Die zweite Spalte ist die Liste der Spalten in dieser Tabelle. Die dritte Spalte enthält die Listenspaltennamen in der Referenzierungstabelle.

Wenn Sie also eine Tabelle people_report mit einer Spalte rep_key haben, die ein Fremdschlüssel für report.key ist, erhalten Sie ungefähr Folgendes:

people_report        key       rep_key
Henri
quelle
1

Wenn Sie nur nach dem Namen der referenzierten Tabellen suchen, hilft dieser Code

SELECT o.name
FROM sysobjects o
WHERE EXISTS (  SELECT 1 FROM sysconstraints C
    JOIN sysreferences R ON R.constrid=C.constrid
    WHERE EXISTS ( SELECT 1 FROM sysobjects o2
        WHERE o2.id=C.tableid
        AND o2.name ='tableName' )  
AND R.reftabid=o.id )
Roberto Montenegro
quelle