Não seria o caso simplesmente de vc executar uma Consulta num script que te dê isso, tipo :
DECLARE v_max number; BEGIN select max(nomedacolunaID) into v_max from nomedatabela; execute immediate ('CREATE SEQUENCE nomedasequence START WITH ' || v_max); END; / ?? []s Chiappa --- Em oracle_br@yahoogrupos.com.br, Ana Cássia Japiassu Diniz <anajapiassu@...> escreveu > > 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 > <jlchiappa@...>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] >