Select Extremamente complexo, e difícil, muito trabaho...

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
Jefries
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 14
Registrado em: Dom, 09 Mai 2010 4:20 pm
Localização: Sorocaba

Olá galera, beleza??

venho aqui mais uma vez pedir uma ajuda a você para ver se consigo resolver um probleminha que estou tendo(e realmente estou quebrando a cabeça)

estamos migrando um de nossos sistemas de Oracle para SQL Server, até
ai beleza...

O problema começa na nova base que tem algumas tabelas a mais(como se fossem dicionário de dados)

Em uma delas, preciso cadastras os relacionamentos existentes na base(
veja bem os relacionamento e não criar FK's), nessa tabela eu tenho 4 campos "tabela_pai", "tabela_filha", "campos_mestre", "campos_detalhe"

Muito bem, minha base tem simplesmente mais de 1500 FK's...

Já pensou perder tudo isso de tempo procurando tabelas, vendo seus relacionamentos, etc, etc...

levaria talvez semanas para conseguir montar um script...

bem, eu fiz a seguinte consulta para agilizar esse processo:

Selecionar tudo

--Testem em suas bases Oracle
select   c2.table_name TABELAPAI, 
c.table_name TABELAFILHA, 
c2.column_name CAMPOSMESTRE, 
c.column_name CAMPOSFILHOS, u.constraint_name
from user_constraints u,
     user_cons_columns c,
     user_cons_columns c2
where u.constraint_type = 'R'
  and u.owner = c.owner
  and u.constraint_name = c.constraint_name
  and u.r_owner = c2.owner
  and u.r_constraint_name = c2.constraint_name
  and u.owner = 'MASTER'
até ai tudo bem...

Pensei ter resolvido meu problema de uma vez, fiquei muito contente e tudo mais, porém surgiu um detalhe....

Preciso cadastrar as chaves compostas, ou seja, se tiver dois campos que formam a FK, preciso caadstrá-los no meu dicionário de dados(fazer isso na mesma linha )

ou seja, terei de fazer um trabalho altamente cansativo e repetitivo durante dias e dias até ver tabela por tabela...

este problema eu só estou tendo por causa da chaves compostas,

será que alguém poderia me ajudar a fazer alguma consulta, ou alguma função para que eu possa ter uma tabela que me de os Scripts??

Ou talvez alguma outra forma para mim agilizar este processo???

desde de já obrigado.

Se alguém não entendeu eu explico de outra forma rsrs...
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

não sei se entendi a sua dúvida..

acho q é so você fazer um script com 2 cursores.. o sua coluna camposMestre repete o valor dai e so concatenar e você tera sua linha unica
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Eu fiz algo parecido, veja esse tópico:
http://glufke.net/oracle/viewtopic.php?t=883

No seu caso, talvez daria pra utilizar a logica existente nesse select pra não mostrar de apenas 1 tabela, e sim de todas.
burga
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Qui, 26 Nov 2009 1:05 pm
Localização: SP
Ricardo H. Tajiri

Veja se ajuda:

Selecionar tudo

SELECT c2.table_name TABELAPAI,
  c.table_name TABELAFILHA,
  u.constraint_name,
  LTRIM(SYS_CONNECT_BY_PATH(c2.column_name,','),',') CAMPOSMESTRE,
  LTRIM(SYS_CONNECT_BY_PATH(c.column_name,','),',') CAMPOSFILHOS
FROM user_constraints u,
  user_cons_columns c,
  user_cons_columns c2
WHERE u.constraint_type = 'R'
AND u.owner             = c.owner
AND u.constraint_name   = c.constraint_name
AND u.r_owner           = c2.owner
AND u.r_constraint_name = c2.constraint_name
AND c2.position         = c.position
AND u.owner = 'MASTER' 
AND c2.position         =
  (SELECT MAX(c1.position)
  FROM user_cons_columns c1
  WHERE c1.constraint_name = c2.constraint_name
  )
  START WITH c2.position             = 1
  CONNECT BY PRIOR u.constraint_name = u.constraint_name
AND PRIOR c2.position                = c2.position - 1
ORDER BY u.constraint_name;
Responder
  • Informação