web-dev-qa-db-ja.com

Sybaseの特定のテーブルへの外部キーを持つテーブルを識別するにはどうすればよいですか?

Sybaseの特定のテーブルへの外部キーを持つ任意のテーブルのテーブル/列名を選択するSQLステートメント(できれば)を探しています。 sys...テーブルですが、sybaseはまったく新しいので、頭も足指も作れません。ですから、正しい方向への助けは高く評価されます。

編集:完全を期すために:SELECT @@VERSION 戻り値

「Adaptive Server Enterprise/15.0.3/EBF 17156 ESD#3/P/Sun_svr4/OS 5.8/ase1503/2726/64-bit/FBO/Fri Feb 5 05:26:23 2010」

編集2
あなたの提案、特にAndrew Bickertonのコメントに感謝します。これにより、出発点としてさらに先に進むための基本的なSQL selectステートメントを作成できました。

他の誰かがそれに興味がある場合は、ここにあります:

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'
7

私はsybaseで作業してからしばらく経ちましたが、(メモリから)次のSQLは正しい方向を示しているはずです。

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

オンラインのsybaseブック(システムテーブル) も確認できます。

4
2
ruir3

上記のアプローチ(sysconstraintsとsysreferencesを使用)は、参照制約がある場合にのみ機能することに注意してください。外部キーだけが定義されていて、制約がない場合、そこには表示されません。特定のテーブルに関連するすべての外部キーを取得するには、syskeysを使用できます。

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')

(レポートをテーブルの名前に置き換えます)。

最初の列の戻り値は、このテーブルを指す外部キーを持つテーブルの名前です。 2番目の列は、このテーブルの列のリストです。 3番目の列は、参照テーブルのリスト列名です。

したがって、report.keyの外部キーである列rep_keyを持つテーブルpeople_reportがある場合、次のような結果が得られます。

people_report        key       rep_key
2
Henri

参照されているテーブル名だけを探している場合は、このコードが役立ちます

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 )
1