none
Saber origem das chaves estrangeiras de uma tabela

    Question

  • Olá pessoal,

    Tem alguma forma de, numa select, eu ter as chaves estrangeiras de uma tabela e ver de onde elas se originam? Por exemplo, numa tabela de clientes tenho várias chaves estrangeiras, gostaria de criar um select q me traga, por exemplo:

    TABELA CONSULTADA CHAVE ESTRANGEIRA TABELA DE ORIGEM
    TB_Clientes Cid_Codigo TB_Cidades
    TB_Clientes Cid_Natural TB_Cidades
    TB_Clientes Ban_Codigo TB_Bancos
    TB_Clientes Nat_Codigo TB_Natureza


    Se houverem outras informações tb seria interessante, como tipo de campo, tamanho do campo e outras que puderem vir, mas principalmente a tabela de origem das chaves estrangeiras.

     

    Grato,

    Ilano.

    Friday, August 20, 2010 1:54 PM

Answers

  • Ilano,

    Veja se esse script atende sua necessidade:

    SELECT 
      Tabela_FK = FK.TABLE_NAME, 
      Coluna_FK = ____.COLUMN_NAME, 
      Tabela_PK = PK.TABLE_NAME, 
      Coluna_PK = PT.COLUMN_NAME, 
      Nome_Restricao = C.CONSTRAINT_NAME 
    FROM 
      INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
      INNER JOIN 
      INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK 
        ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME 
      INNER JOIN 
      INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK 
        ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME 
      INNER JOIN 
      INFORMATION_SCHEMA.KEY_COLUMN_USAGE ____ 
        ON C.CONSTRAINT_NAME = ____.CONSTRAINT_NAME 
      INNER JOIN 
      ( 
        SELECT 
          i1.TABLE_NAME, i2.COLUMN_NAME 
        FROM 
          INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1 
          INNER JOIN 
          INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 
          ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME 
          WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY' 
      ) PT 
      ON PT.TABLE_NAME = PK.TABLE_NAME 
    	AND PT.TABLE_NAME = 'TBALTERACAO'
    ORDER BY 
      1,2,3,4
    
    Obs: o conteúdo desse script foi retirado do site abaixo, porém fiz algumas pequenas alterações...
    http://sqlserver2000.databases.aspfaq.com/schema-how-do-i-find-all-the-foreign-keys-in-a-database.html

    att.
    Rafael

    Friday, August 20, 2010 2:31 PM
  • Bom Dia,

    Supondo que você está no 2005 ou superior, eu seria um pouco mais econômico.

    -- Cria as tabelas
    CREATE TABLE AVO (IDA INT NOT NULL)
    CREATE TABLE PAI (IDP INT NOT NULL)
    CREATE TABLE FILHO (IDF INT NOT NULL)
    CREATE TABLE NETO (IDN INT NOT NULL)
    -- Cria as PKs
    ALTER TABLE AVO ADD CONSTRAINT PK_AVO PRIMARY KEY (IDA)
    ALTER TABLE PAI ADD CONSTRAINT PK_PAI PRIMARY KEY (IDP)
    ALTER TABLE FILHO ADD CONSTRAINT PK_FILHO PRIMARY KEY (IDF)
    ALTER TABLE NETO ADD CONSTRAINT PK_NETO PRIMARY KEY (IDN)
    -- Cria as FKs
    ALTER TABLE PAI ADD CONSTRAINT FK_PAI_AVO FOREIGN KEY (IDP) REFERENCES AVO (IDA)
    ALTER TABLE FILHO ADD CONSTRAINT FK_FILHO_PAI FOREIGN KEY (IDF) REFERENCES PAI (IDP)
    ALTER TABLE NETO ADD CONSTRAINT FK_NETO_FILHO FOREIGN KEY (IDN) REFERENCES FILHO (IDF)
    -- Mostra as relações
    SELECT OBJECT_NAME(parent_object_id) As TabelaConsultada, name As ChaveEstrangeira,
    OBJECT_NAME(referenced_object_id) As TabelaOrigem FROM sys.foreign_keys
    -- WHERE parent_object_id = OBJECT_ID('TabelaDesejada')
    

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com


    Classifique as respostas. O seu feedback é imprescindível
    Friday, August 20, 2010 2:41 PM
  • Ilano,

    Os apelidos (ou alias)  vc pode fazer assim:

    SELECT 
     FK.TABLE_NAME   AS TABELA_CONSULTADA, 
      ____.COLUMN_NAME AS COLUNA_CHAVE_FK, 
     PK.TABLE_NAME   AS TABELA_ORIGEM, 
     PT.COLUMN_NAME  AS COLUNA_CHAVE_PK,  
     C.CONSTRAINT_NAME AS NOME_RESTRICAO 
    FROM 
     INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
     INNER JOIN 
     INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK 
      ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME 
     INNER JOIN 
     INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK 
      ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME 
     INNER JOIN 
     INFORMATION_SCHEMA.KEY_COLUMN_USAGE ____ 
      ON C.CONSTRAINT_NAME = ____.CONSTRAINT_NAME 
     INNER JOIN 
     ( 
      SELECT 
       i1.TABLE_NAME, i2.COLUMN_NAME 
      FROM 
       INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1 
       INNER JOIN 
       INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 
       ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME 
       WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY' 
     ) PT 
     ON PT.TABLE_NAME = PK.TABLE_NAME 
     --AND PT.TABLE_NAME = 'SUATABELA'
    ORDER BY 
     1,2,3,4
    

    att.

    Rafael

    Friday, August 20, 2010 4:53 PM
  • Ilano!

    Caso nossas respostas tenha te ajudado a solucionar sua dúvida, por favor maque-as como resposta para que os demais usuário se beneficiem!!!

    atenciosamente,
    Rafael Melo

    • Marked as answer by ilanocf Monday, August 23, 2010 1:25 PM
    Friday, August 20, 2010 6:23 PM

All replies

  • Ilano,

    Veja se esse script atende sua necessidade:

    SELECT 
      Tabela_FK = FK.TABLE_NAME, 
      Coluna_FK = ____.COLUMN_NAME, 
      Tabela_PK = PK.TABLE_NAME, 
      Coluna_PK = PT.COLUMN_NAME, 
      Nome_Restricao = C.CONSTRAINT_NAME 
    FROM 
      INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
      INNER JOIN 
      INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK 
        ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME 
      INNER JOIN 
      INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK 
        ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME 
      INNER JOIN 
      INFORMATION_SCHEMA.KEY_COLUMN_USAGE ____ 
        ON C.CONSTRAINT_NAME = ____.CONSTRAINT_NAME 
      INNER JOIN 
      ( 
        SELECT 
          i1.TABLE_NAME, i2.COLUMN_NAME 
        FROM 
          INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1 
          INNER JOIN 
          INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 
          ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME 
          WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY' 
      ) PT 
      ON PT.TABLE_NAME = PK.TABLE_NAME 
    	AND PT.TABLE_NAME = 'TBALTERACAO'
    ORDER BY 
      1,2,3,4
    
    Obs: o conteúdo desse script foi retirado do site abaixo, porém fiz algumas pequenas alterações...
    http://sqlserver2000.databases.aspfaq.com/schema-how-do-i-find-all-the-foreign-keys-in-a-database.html

    att.
    Rafael

    Friday, August 20, 2010 2:31 PM
  • Bom Dia,

    Supondo que você está no 2005 ou superior, eu seria um pouco mais econômico.

    -- Cria as tabelas
    CREATE TABLE AVO (IDA INT NOT NULL)
    CREATE TABLE PAI (IDP INT NOT NULL)
    CREATE TABLE FILHO (IDF INT NOT NULL)
    CREATE TABLE NETO (IDN INT NOT NULL)
    -- Cria as PKs
    ALTER TABLE AVO ADD CONSTRAINT PK_AVO PRIMARY KEY (IDA)
    ALTER TABLE PAI ADD CONSTRAINT PK_PAI PRIMARY KEY (IDP)
    ALTER TABLE FILHO ADD CONSTRAINT PK_FILHO PRIMARY KEY (IDF)
    ALTER TABLE NETO ADD CONSTRAINT PK_NETO PRIMARY KEY (IDN)
    -- Cria as FKs
    ALTER TABLE PAI ADD CONSTRAINT FK_PAI_AVO FOREIGN KEY (IDP) REFERENCES AVO (IDA)
    ALTER TABLE FILHO ADD CONSTRAINT FK_FILHO_PAI FOREIGN KEY (IDF) REFERENCES PAI (IDP)
    ALTER TABLE NETO ADD CONSTRAINT FK_NETO_FILHO FOREIGN KEY (IDN) REFERENCES FILHO (IDF)
    -- Mostra as relações
    SELECT OBJECT_NAME(parent_object_id) As TabelaConsultada, name As ChaveEstrangeira,
    OBJECT_NAME(referenced_object_id) As TabelaOrigem FROM sys.foreign_keys
    -- WHERE parent_object_id = OBJECT_ID('TabelaDesejada')
    

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com


    Classifique as respostas. O seu feedback é imprescindível
    Friday, August 20, 2010 2:41 PM
  • Valeu pessoa! É isso mesmo!

    Agora, Rafael S. Melo, como atribuo apelidos às colunas como no exemplo do Gustavo?

    Friday, August 20, 2010 4:44 PM
  • Ilano,

    Os apelidos (ou alias)  vc pode fazer assim:

    SELECT 
     FK.TABLE_NAME   AS TABELA_CONSULTADA, 
      ____.COLUMN_NAME AS COLUNA_CHAVE_FK, 
     PK.TABLE_NAME   AS TABELA_ORIGEM, 
     PT.COLUMN_NAME  AS COLUNA_CHAVE_PK,  
     C.CONSTRAINT_NAME AS NOME_RESTRICAO 
    FROM 
     INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
     INNER JOIN 
     INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK 
      ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME 
     INNER JOIN 
     INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK 
      ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME 
     INNER JOIN 
     INFORMATION_SCHEMA.KEY_COLUMN_USAGE ____ 
      ON C.CONSTRAINT_NAME = ____.CONSTRAINT_NAME 
     INNER JOIN 
     ( 
      SELECT 
       i1.TABLE_NAME, i2.COLUMN_NAME 
      FROM 
       INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1 
       INNER JOIN 
       INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 
       ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME 
       WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY' 
     ) PT 
     ON PT.TABLE_NAME = PK.TABLE_NAME 
     --AND PT.TABLE_NAME = 'SUATABELA'
    ORDER BY 
     1,2,3,4
    

    att.

    Rafael

    Friday, August 20, 2010 4:53 PM
  • Blz! Obrigado pela atenção de todos.
    Friday, August 20, 2010 6:07 PM
  • Ilano!

    Caso nossas respostas tenha te ajudado a solucionar sua dúvida, por favor maque-as como resposta para que os demais usuário se beneficiem!!!

    atenciosamente,
    Rafael Melo

    • Marked as answer by ilanocf Monday, August 23, 2010 1:25 PM
    Friday, August 20, 2010 6:23 PM