Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Luciano Heric

Em busca dos relacionamentos...em busca das FK

Recommended Posts

Pessoal!Estou precisando de um Help...Tenho dois campos campo1 e campo2 que são Primary key em suas tabelas (tabela1 e tabela2 respectivamente)...com seria um Script para alterar o tipo de dado destes campos, de NUMBER(5) para NUMBER(10), lembrando-se que eles são referenciados em várias tabelas como FK. O Script deve alterar o tipo de dado dos dois campos, identificar as tabelas e campos relacionados (não necessariamente terão o mesmo nome ou seja, o campo1 da tabela1 pode ser FK na tabela9 e chamar-se campo58) e alterá-los para NUMBER(10).Se precisarem de mais detalhes...: lucianoheric@yahoo.com.brGrande Abraço e Obrigado...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Luciano, Já que está alterando a modelagem dos campos de PK, então deverá alterar as FKs consequentemente. O melhor que você poderá fazer é EXCLUIR os relacionamentos, alterar todos os campos necessarios e posteriormente recriar os relacionamentos. EU NÃO TENHO CERTEZA, que somente DESABILITANDO as CONSTRAINTS e após habilitar com NOVALIDATE ele irá aceitar as alterações de campos, já que irá mudar a consistência dos dados. Essa também poderá ser uma solução. A view que você precisa consultar é DBA_CONSTRAINTS, terá o nome da constraints e com que ela está se relacionando. Abraços, :mellow:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Luciano,

 

Já que está alterando a modelagem dos campos de PK, então deverá alterar as FKs consequentemente.

 

O melhor que você poderá fazer é EXCLUIR os relacionamentos, alterar todos os campos necessarios e posteriormente recriar os relacionamentos.

 

EU NÃO TENHO CERTEZA, que somente DESABILITANDO as CONSTRAINTS e após habilitar com NOVALIDATE ele irá aceitar as alterações de campos, já que irá mudar a consistência dos dados. Essa também poderá ser uma solução.

 

A view que você precisa consultar é DBA_CONSTRAINTS, terá o nome da constraints e com que ela está se relacionando.

 

Abraços, :mellow:

O problema é que são muitas as tabelas nas quais estes dois campos são FK e são muitos os Clientes...preciso fazer isto através de Script pois, as alterações deverão ser imperceptíveis aos clientes. estou pensando em alguma coisa assim.:

BEGIN

DECLARE

 

P_OWNER VARCHAR2(50);

P_USERNAME VARCHAR2(50);

P_CONSTRAINT_NAME VARCHAR2(50);

P_TABLE_NAME VARCHAR2(50);

P_COLUMN_NAME VARCHAR2(50);

P_CONSTRAINT_NAME_FK VARCHAR2(50);

P_TABLE_NAME_FK VARCHAR2(50);

P_COLUMN_NAME_FK VARCHAR2(50);

 

CURSOR VERIFICA_PK IS

SELECT T1.OWNER, T1.CONSTRAINT_NAME, T1.TABLE_NAME, T1.COLUMN_NAME FROM DBA_CONS_COLUMNS T1, DBA_CONSTRAINTS T2

WHERE T1.OWNER = P_USERNAME

AND T2.CONSTRAINT_NAME = T1.CONSTRAINT_NAME

AND T2.CONSTRAINT_TYPE = 'P'

AND T1.COLUMN_NAME IN('CAMPO1','CAMPO2');

 

CURSOR VERIFICA_FK IS

SELECT T1.TABLE_NAME, T1.CONSTRAINT_NAME, T2.COLUMN_NAME FROM DBA_CONSTRAINTS T1, DBA_CONS_COLUMNS T2

WHERE T1.R_CONSTRAINT_NAME = P_CONSTRAINT_NAME

AND T2.CONSTRAINT_NAME = T1.CONSTRAINT_NAME

ORDER BY T1.TABLE_NAME, T2.COLUMN_NAME, T1.CONSTRAINT_NAME;

 

BEGIN

 

SELECT USERNAME INTO P_USERNAME FROM V$SESSION WHERE AUDSID = USERENV('SESSIONID');

 

OPEN VERIFICA_PK;

LOOP

FETCH VERIFICA_PK INTO P_OWNER, P_CONSTRAINT_NAME, P_TABLE_NAME, P_COLUMN_NAME;

EXIT WHEN VERIFICA_PK%NOTFOUND;

 

/* ALTERANDO TODAS A COLUNAS QUE SÃO PK E POSSUEM OS NOMES COLUNA1 OU COLUNA2 */

 

EXECUTE IMMEDIATE 'ALTER TABLE '||P_TABLE_NAME||' MODIFY '||P_COLUMN_NAME||' NUMBER(10)';

 

OPEN VERIFICA_FK;

LOOP

FETCH VERIFICA_FK INTO P_TABLE_NAME_FK, P_CONSTRAINT_NAME_FK, P_COLUMN_NAME_FK;

EXIT WHEN VERIFICA_FK%NOTFOUND;

 

/* ALTERANDO TODAS A COLUNAS QUE SÃO FK E POSSUEM OS NOMES DA PK DE ORIGEM, COLUNA1 OU COLUNA2 */

 

IF P_COLUMN_NAME_FK IN('COLUNA1','COLUNA2') THEN

EXECUTE IMMEDIATE 'ALTER TABLE '||P_TABLE_NAME_FK||' MODIFY '||P_COLUMN_NAME_FK||' NUMBER(10)';

END IF;

END LOOP;

CLOSE VERIFICA_FK;

 

END LOOP;

CLOSE VERIFICA_PK;

END;

END;

 

O problema do Script acima é de quando a coluna FK não possuir o mesmo nome da PK que a originou...e existem vários casos. Como vou associar os campos de nomes diferentes ???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pela posição do DBA_CONS_COLUMNS daria , pois a FK tem de ter as mesmas da PK.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal consegui...fiz o seguinte.:BEGIN DECLARE P_TABELA VARCHAR2(30); P_CAMPO VARCHAR2(30); P_USERNAME VARCHAR2(50); CURSOR VERIFICA_CODUSU_CODLOCAL IS SELECT TAB.TABLE_NAME, COL.COLUMN_NAME FROM DBA_TAB_COLUMNS COL,DBA_TABLES TAB WHERE TAB.OWNER = P_USERNAME AND TAB.TABLE_NAME = COL.TABLE_NAME AND COL.OWNER = TAB.OWNER AND COL.DATA_PRECISION < 10 AND COLUMN_NAME IN(SELECT COL.COLUMN_NAME FROM DBA_CONSTRAINTS CONS, DBA_CONS_COLUMNS COL WHERE R_CONSTRAINT_NAME IN ('videobs1*','videobs2*') AND COL.CONSTRAINT_NAME = CONS.CONSTRAINT_NAME AND COL.TABLE_NAME = CONS.TABLE_NAME AND COL.OWNER = P_USERNAME AND CONS.OWNER = COL.OWNER); BEGIN SELECT USERNAME INTO P_USERNAME FROM V$SESSION WHERE AUDSID = USERENV('SESSIONID'); OPEN VERIFICA_CODUSU_CODLOCAL; LOOP FETCH VERIFICA_CODUSU_CODLOCAL INTO P_TABELA, P_CAMPO; EXIT WHEN VERIFICA_CODUSU_CODLOCAL%NOTFOUND; EXECUTE IMMEDIATE 'ALTER TABLE '||P_TABELA||' MODIFY '||P_CAMPO||' NUMBER(10)'; END LOOP; END;END;videobs1* - Nome da Primary key da tabela1 (que contém o campo1).videobs2* - Nome da Primary key da tabela2 (que contém o campo2).Agradeço a todos pela cooperação...abraços...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.