AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 2837
Accepted
René Nyffenegger
René Nyffenegger
Asked: 2011-05-21 01:54:22 +0800 CST2011-05-21 01:54:22 +0800 CST 2011-05-21 01:54:22 +0800 CST

Como identifico tabelas que possuem uma chave estrangeira para uma tabela específica no Sybase?

  • 772

Estou procurando (de preferência) uma instrução SQL que selecione os nomes de tabela/coluna para qualquer tabela com uma chave estrangeira para uma determinada tabela no Sybase. Acho que deveria ser possível de alguma forma com as sys...tabelas, mas sendo completamente novo no sybase, não consigo entender. Portanto, qualquer ajuda na direção certa é muito apreciada.

Editar: Por uma questão de integridade: SELECT @@VERSIONretorna

'Adaptive Server Enterprise/15.0.3/EBF 17156 ESD#3/P/Sun_svr4/OS 5.8/ase1503/2726/64-bit/FBO/Sex 5 de fevereiro 05:26:23 2010'

Editar 2
Muito obrigado por suas sugestões, especialmente o comentário de Andrew Bickerton . Isso me permitiu construir uma instrução select SQL rudimentar para um ponto de partida para ir mais longe.

Caso alguém se interesse, aqui está:

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'
sybase referential-integrity
  • 4 4 respostas
  • 18157 Views

4 respostas

  • Voted
  1. Best Answer
    Andrew Bickerton
    2011-05-21T02:14:18+08:002011-05-21T02:14:18+08:00

    Já faz um tempo desde que trabalhei no sybase, mas (da memória) o seguinte sql deve apontar na direção certa:

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

    você também pode conferir os livros do sybase online (tabelas do sistema)

    • 4
  2. ruir3
    2012-04-13T04:58:10+08:002012-04-13T04:58:10+08:00

    Outra abordagem é "sp_depends"

    URL do Sybase: http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0.sprocs/html/sprocs/sprocs68.htm

    • 2
  3. Henri
    2012-11-03T05:12:14+08:002012-11-03T05:12:14+08:00

    Observe que a abordagem mostrada acima (usando sysconstraints e sysreferences) só funcionará se você tiver restrição referencial. Se você tiver apenas uma chave estrangeira definida, mas sem restrição, não a verá lá. Para obter todas as chaves estrangeiras relacionadas a uma determinada tabela, você pode usar 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')
    

    (substitua report pelo nome da sua tabela).

    O retorno da primeira coluna é o nome da tabela com uma chave estrangeira apontando para esta tabela. A segunda coluna é a lista de colunas nesta tabela. E as terceiras colunas são os nomes das colunas da lista na tabela de referência.

    Portanto, se você tiver uma tabela people_report com uma coluna rep_key, que é uma chave estrangeira para report.key, obterá algo como isto:

    people_report        key       rep_key
    
    • 2
  4. Roberto Montenegro
    2015-08-13T09:20:15+08:002015-08-13T09:20:15+08:00

    Se você estiver procurando apenas pelo nome das tabelas referenciadas, este código ajudará

    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

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve