Em momentos anteriores tivemos o erro de entrada duplicada para uma chave específica de alguma tabela ao tentar inserir novos registros pelo SEI. Nessas ocasiões, rodamos um script de atualização de sequências, mas ele era da versão 2.6 da aplicação. Onde posso conseguir um com a mesma funcionalidade para o SEI 3.0?
Aqui na ESMPU fiz um script (oracle) para identificar e gerar a DDL para resetar todas as sequences do SEI que estão com o valor menor do que o MAX da tabela.
O Script foi escrito para oracle 12c, mas deve rodar em outras versões. O script não muda nada no banco, apenas 'printa' no server output os comandos para serem executados e resetar as sequences necessárias.
-- ESTA PARTE DO SCRIPT VISA CORRIGIR ALGUMAS SEQUENCES QUE ESTÃO COM O VALOR MENOR DO QUE -- O ÚLTIMO ID DE ALGUMAS TABELAS -- QUE PODEM DAR PROBLEMA. NENHUM DOS COMANDOS ABAIXO SERÁ EXECUTADO AUTOMATICAMENTE. -- O QUE ESTA PARTE FAZ É BUSCAR AS INFORMAÇÕES E MONTAR O RESET DAS SEQUENCES AUTOMATICAMENTE. -- ANTES DE UTILIZAR, ESTUDE BEM O RESULTADO DO SCRIPT.
DECLARE v_object_name VARCHAR2(30); v_owner VARCHAR2(30); v_constraint_name VARCHAR2(30); curr_seq_value NUMBER; v_retorno NUMBER; v_max_table NUMBER; v_exists NUMBER; BEGIN -- Para todas as tabelas da lista, verificar se o MAX da tabela é MENOR OU IGUAL ao currval da sequence. Se for, está errado.; DBMS_OUTPUT.PUT_LINE ('BEGIN'); FOR object_rec IN (SELECT -- 'select MAX('||COLUMN_NAME||') from '||TAB.OWNER || '.' || TAB.TABLE_NAME TAB.OWNER, TAB.TABLE_NAME, CCOL.COLUMN_NAME FROM SYS.dba_constraints cons INNER JOIN DBA_TABLES tab ON (tab.TABLE_NAME = CONS.TABLE_NAME AND tab.owner = cons.owner) INNER JOIN SYS.dba_cons_columns CCOL ON (CCOL.CONSTRAINT_NAME = CONS.CONSTRAINT_NAME) INNER JOIN dba_tab_cols tcol ON (tcol.column_name = CCOL.COLUMN_NAME AND DATA_TYPE = 'NUMBER' AND tab.owner = tcol.owner AND tab.TABLE_NAME = tcol.TABLE_NAME) WHERE CONSTRAINT_TYPE = 'P' AND TAB.OWNER ='SEI' ) LOOP EXECUTE IMMEDIATE 'select NVL(MAX('||object_rec.COLUMN_NAME||'), 0) from '||object_rec.OWNER || '.' || object_rec.TABLE_NAME INTO v_max_table; -- DBMS_OUTPUT.put_line ((object_rec.TABLE_NAME||' NVL(MAX('||object_rec.COLUMN_NAME||'), 0) ' || v_max_table)); -- Verificar se existe a sequence da tabela BEGIN EXECUTE IMMEDIATE 'select LAST_NUMBER from SYS.dba_sequences where SEQUENCE_NAME = ''SEQ_'||object_rec.TABLE_NAME || ''' and SEQUENCE_OWNER = ''SEI''' INTO curr_seq_value;
IF (curr_seq_value < v_max_table and v_max_table < 100000000) THEN
DBMS_OUTPUT.PUT_LINE (' -- Para a tabela '||object_rec.TABLE_NAME||' -- MAX: '||v_max_table||' - SEQ: '||curr_seq_value||'. Diferença de +'||(v_max_table - curr_seq_value)||' Unidades. Resetar para o MAX+1 EXECUTE IMMEDIATE ''alter sequence SEI.SEQ_'|| object_rec.TABLE_NAME|| ' RESTART START WITH '||(v_max_table+1)||''';');
END IF ; EXCEPTION WHEN NO_DATA_FOUND THEN -- DBMS_OUTPUT.put_line ('SEQ: SEQ_'||object_rec.TABLE_NAME || ' não existe'); NULL; END;
END LOOP; DBMS_OUTPUT.PUT_LINE ('END;'); END;
*/
--
*Guilherme Marques Amaral de Campos * Chefe do Núcleo de Gerenciamento de Banco de Dados NUBAN/STI/ESMPU
*Tel: (061) 3313-5386*
Escola Superior do Ministério Público da União | SGAS Av. L2 Sul, Qd. 604 lt 23 - CEP: 70200-640 - Brasília - DF Tel.: (61) 3313 - 5115
Em 17/03/2017 11:52, Bruno Davi Kretzmann escreveu:
> Bom dia! > > Em momentos anteriores tivemos o erro de entrada duplicada para uma > chave específica de alguma tabela ao tentar inserir novos registros > pelo SEI. Nessas ocasiões, rodamos um script de atualização de > sequências, mas ele era da versão 2.6 da aplicação. Onde posso > conseguir um com a mesma funcionalidade para o SEI 3.0? > > Desde já agradeço a atenção dispendida. > > Att. > > > > > > > _______________________________________________ > sei-tecnico mailing list > sei-tecnico@listas.softwarepublico.gov.br >https://listas.softwarepublico.gov.br/mailman/cgi-bin/listinfo/sei-tecnico