Ana Um ponto que acho importante: a chave composta (antiga PK), que coincide com as duas FK's (tabela associativa), deveria agora ser uma "unique", por questão de integridade.
Verifique a regra de negócio. Caso isso realmente seja pertinente, declare uma unique também. [ ] André Em 11 de julho de 2012 15:42, Étore Schiavini <et...@schiavini.inf.br>escreveu: > ** > > > Só uma pergunta: > > Por que não utilizar a própria sequence para popular a nova coluna (id) > também nas linhas pre-existentes ? > > Ao meu ver um simples "update tabela set id = sequencia.nextval" resolveria > tudo de uma só vez. > > Étore > > > -----Original Message----- > From: oracle_br@yahoogrupos.com.br [mailto:oracle_br@yahoogrupos.com.br] > On > Behalf Of Ana Cássia Japiassu Diniz > Sent: Wednesday, July 11, 2012 2:58 PM > To: oracle_br@yahoogrupos.com.br > Subject: Re: [oracle_br] Re: Ajuda > > Obrigada a todos pela ajuda. > > Consegui fazer praticamente toda a alteração que preciso. Falta apenas a > criação da sequence para esta tabela, cujo o valor inicial deverá ser o > último valor do novo atributo adicionado na tabela. > Como eu posso definir o start with da sequence com este valor? > Não posso colocar isso fixo, pois esta alteração precisarei fazer em três > bancos que contêm dados diferentes. > > Muito obrigada. > > Ana > Em 11 de julho de 2012 14:13, J. Laurindo Chiappa > <jlchia...@yahoo.com.br>escreveu: > > > ** > > > > > > Bom dia, Ana - não vejo grandes problemas, mas vc deverá saber que : > > > > a) no RDBMS Oracle vc normalmente não consegue mudar a PK, então ela > > tem que ser dropada e recriada com o novo atributo que vc quer : > > Obviamente, então, se essa PK a ser alterada é usada como origem para > > FK de outras tabelas, logicamente vc deverá dropar as FKs primeiro > > (quebrando o uso da PK como pai), e depois da nova PK criada, vc vai > > ter que recriar as FKs, apontando para a nova PK.... Obviamente > > também, se a PK vai ser em cima de uma nova coluna, essa nova coluna > > tem que ser Adicionada não só na tabela-pai MAS também nas > > tabelas-filhas, para servir de base para a nova FK referenciando a > > nova PK... É muito, muito frequente o pessoal se "esquecer" deste > > Importante detalhe e se dar mal na hora da implementação por causa das > FKs.. > > > > b) vc até poderia, ao menos em parte, fazer via DBMS_REDEFINITION, mas > > imho é mais fácil/direto executar os comandos manualmente, e também já > > que vc quer a maneira mais segura, eu Recomendaria que vc solicitasse > > uma janela de manutenção, em que o banco estará inacessível para vc > > poder fazer as alterações todas sem se preocupar com locks eventuais, > > acessos de usuário, dados sendo entrados/alterados/removidos, etc... > > > > c) como é Normal em qquer alteração, vc Tem que Ter um backup o mais > > recente possível, Válido e testado, antes de proceder : muitas vezes > > se agenda alterações do tipo para depois da janela de backup > > Exatamente por esse motivo... > > > > Isto posto, um exemplo rápido - apenas notando que vc infelizmente Não > > nos Dá a versão, então estou supondo ao menos versão 10gr2 : > > > > => criação de tabela com PK e de algumas FKs que a referenciam : > > > > SYSTEM@O10GR2::SQL>create table T_PAI (c1 number, c2 varchar2(40), c3 > > varchar2(80) ); > > > > Tabela criada. > > > > SYSTEM@O10GR2::SQL>alter table T_PAI add constraint T_PAI_PK primary > > key (c1, c2); > > > > Tabela alterada. > > > > SYSTEM@O10GR2::SQL>insert into T_PAI values(1, 'Chave 1', 'Linha 1'); > > > > 1 linha criada. > > > > SYSTEM@O10GR2::SQL>insert into T_PAI values(2, 'Chave 2', 'Linha 2'); > > > > 1 linha criada. > > > > SYSTEM@O10GR2::SQL>create table T_FILHA1 (c1 number, c2 varchar2(40), > > c3 > > varchar2(80) ); > > > > Tabela criada. > > > > SYSTEM@O10GR2::SQL>create table T_FILHA2 (c1 number, c2 varchar2(40), > > c3 > > varchar2(80) ); > > > > Tabela criada. > > > > SYSTEM@O10GR2::SQL>alter table T_FILHA1 add constraint T_FILHA1_FK > > foreign key (c1, c2) references T_PAI(c1, c2); > > > > Tabela alterada. > > > > SYSTEM@O10GR2::SQL>alter table T_FILHA2 add constraint T_FILHA2_FK > > foreign key (c1, c2) references T_PAI(c1, c2); > > > > Tabela alterada. > > > > SYSTEM@O10GR2::SQL>insert into T_FILHA1 values(1, 'Chave 1', 'Filha > > 1'); > > > > 1 linha criada. > > > > SYSTEM@O10GR2::SQL>insert into T_FILHA2 values(2, 'Chave 2', 'Filha > > 2'); > > > > 1 linha criada. > > > > SYSTEM@O10GR2::SQL>commit; > > > > Commit concluido. > > > > ==> veja que Não Posso dropar PK usada por FKs : > > > > SYSTEM@O10GR2::SQL>alter table T_PAI drop constraint T_PAI_PK; alter > > table T_PAI drop constraint T_PAI_PK > > * > > ERRO na linha 1: > > ORA-02273: esta chave exclusiva/primaria e referenciada por algumas > > chaves externas > > > > => vou então listar as FKs, já gerando os comandos de drop que eu só > > copio & colo : > > > > SYSTEM@O10GR2::SQL>select 'alter table ' || table_name || ' drop > > constraint ' || constraint_name || ';' from dba_constraints where > > owner='SYSTEM' and r_constraint_name='T_PAI_PK'; > > > > 'ALTERTABLE'||TABLE_NAME||'DROPCONSTRAINT'||CONSTRAINT_NAME||';' > > ---------------------------------------------------------- > > alter table T_FILHA1 drop constraint T_FILHA1_FK; alter table T_FILHA2 > > drop constraint T_FILHA2_FK; > > > > => o copy/paste em ação : > > > > SYSTEM@O10GR2::SQL>alter table T_FILHA1 drop constraint T_FILHA1_FK; > > > > Tabela alterada. > > > > SYSTEM@O10GR2::SQL>alter table T_FILHA2 drop constraint T_FILHA2_FK; > > > > Tabela alterada. > > > > SYSTEM@O10GR2::SQL> > > > > => agora é dropar a PK, criar a sequence que vai alimentar o ID, criar > > a coluna de ID na tabela-pai E nas filhas e adicionar a nova PK e as > > novas FKs, normal, okdoc ? > > > > []s > > > > Chiappa > > > > > > --- Em oracle_br@yahoogrupos.com.br, Ana Cássia Japiassu Diniz > > <anajapiassu@...> escreveu > > > > > > Olá pessoal, bom dia. > > > > > > Estou com o seguinte problema: > > > > > > Tenho uma tabela que era resultado de um relacionamento nxm e sua > > > chave primária era composta com por dosi atributos. Preciso alterar > > > esta chave para que um novo atributo (apenas ele) passr a ser a > > > chave primária. Este atributo é um id. A tabela já possui dados e não > poderão ser perdidos. > > Qual > > > a maneira mais segura para preencher os dados deste novo atributo > > > que > > será > > > a PK? O valores deste atributo deverão ser sequencial. > > > > > > Também passará a existir uma sequence que deverá ser criada com o > > > valor inicial igual último valor de registros da tabela, ou seja, o > > > último > > valor > > > do novo atributo. > > > > > > Desde já agradeço a ajuda. > > > > > > Ana > > > > > > > > > [As partes desta mensagem que não continham texto foram removidas] > > > > > > > > > > > -- > "A Cristo, por Maria, > Juntos até o Céu." > > Jesus Misericordioso, Eu confio em Vós! > > "Viver e levar para o mundo a misericórdia, é a nossa missão" > Comunidade Católica Missionária Filhos da Misericórdia > > [As partes desta mensagem que não continham texto foram removidas] > > ------------------------------------ > > ---------------------------------------------------------- > ---------------------------------------------- > >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de > inteira > responsabilidade de seus remetentes. > Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ > ---------------------------------------------------------- > ---------------------------------------------- > >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » > >Procedure » Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO > >ESPAÇO! VISITE: http://www.oraclebr.com.br/ > ---------------------------------------------------------- > -------------------------------------------- Links do Yahoo! Grupos > > > [As partes desta mensagem que não continham texto foram removidas] ------------------------------------ -------------------------------------------------------------------------------------------------------------------------- >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira >responsabilidade de seus remetentes. Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ -------------------------------------------------------------------------------------------------------------------------- >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » >Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: >http://www.oraclebr.com.br/ ------------------------------------------------------------------------------------------------------------------------ Links do Yahoo! Grupos <*> Para visitar o site do seu grupo na web, acesse: http://br.groups.yahoo.com/group/oracle_br/ <*> Para sair deste grupo, envie um e-mail para: oracle_br-unsubscr...@yahoogrupos.com.br <*> O uso que você faz do Yahoo! Grupos está sujeito aos: http://br.yahoo.com/info/utos.html