- This topic has 5 replies, 3 voices, and was last updated 8 years ago by José Laurindo Chiappa.
-
AuthorPosts
-
28 de outubro de 2016 at 4:16 pm #108487Iago LourinhoParticipant
Bom dia, senhores
Alguma bênção pode me ajudar a resolver esse erro na hora da importação do dump:
ORA-39083: Tipo de objeto JOB falhou ao ser criado com o erro:
ORA-00001: restrição exclusiva (SYS.I_JOB_JOB) violada
O código sql com falha é:
BEGIN
SYS.DBMS_IJOB.SUBMIT( JOB=> 340, LUSER=> ‘PACAJUS_PROD’, PUSER=> ‘PACAJUS_PROD’, CUSER=> ‘PACAJUS_PROD’, NEXT_DATE=> TO_DATE(‘2016-10-04 00:00:00’, ‘YYYY-MM-DD:HH24:MI:SS’), INTERVAL=> ‘TRUNC(SYSDATE) + 1’, BROKEN=> FALSE, WHAT=> ‘GSH_DESAB_USUARIO_TEMPO_ACESSO;
END;O MESMO NÃO CONSEGUER SER CRIADO NA IMPORTAÇÃO DO DUMP,SE POSSIVEL ALGUEM ME AJUDAR A RESOLVER OU TER UMA SOLUÇÃO PRA ESSE PROBLEMAS EU SEREI MUITO GRATO.
OBRIGDO.
28 de outubro de 2016 at 5:28 pm #108488rmanParticipant@Iago Lourinho
BEGIN
SYS.DBMS_IJOB.SUBMIT( JOB=> 340, LUSER=> 'PACAJUS_PROD', PUSER=> 'PACAJUS_PROD', CUSER=> 'PACAJUS_PROD', NEXT_DATE=> TO_DATE('2016-10-04 00:00:00', 'YYYY-MM-DD:HH24:MI:SS'), INTERVAL=> 'TRUNC(SYSDATE) + 1', BROKEN=> FALSE, WHAT=> 'GSH_DESAB_USUARIO_TEMPO_ACESSO;
END;
Creio que o job 340 já existe nesse banco de dados.
28 de outubro de 2016 at 5:45 pm #108489Iago LourinhoParticipantIrmão, Muito Obrigado eu verifiquei aqui é realmente o job existe.
Irmão se não for incomodo pode me explicar como funciona esse SYS.DBMS_IJOB.SUBMIT.
28 de outubro de 2016 at 8:36 pm #108491rmanParticipant@Iago Lourinho
Esse PROCEDURE cria o job de acordo com os parâmetros.
28 de outubro de 2016 at 9:01 pm #108492José Laurindo ChiappaModeratorBom, vou me meter, xo ver se consigo te ajudar – seguinte, tudo dentro de um database Oracle (uma tabela, um índice, um job de banco, enfim, qualquer Objeto que vc vá criar dentro dum banco) é guardado em tabelas internas Oracle, E ao mesmo tempo possui um OBJECT_ID, um Identificador, uma CHAVE Interna… Muito bem : para alguns objetos (por exemplo, TABELAS e ÍNDICES), o comando de criação do objeto (um CREATE TABLE, digamos, ou um CREATE INDEX, o que for) já vai dar pro objeto um ID completamente novo, mas para outros (é o caso de DATABASE JOBS, por exemplo, que são criados por esse DBMS_IJOB.SUBMIT aí – ESSA é a função dele, ok ?) é você que tem que indicar o ID na hora da criação… OKDOC ??? Consulte o manual de DBA Oracle da sua versão no capítulo sobre JOBs que vc encontra refs sobre isso…
O seu problema está CLARO, então : coincidentemente vc já tinha um outro objeto (JOB, provavelmente) criado no banco de destino com esse mesmo ID 340 que o job ganhou lá no banco origem, E o import normalmente tenta criar JOBs chamando o DBMS_IJOB ** exatamente o mesmo ** OBJECT_ID que veio do banco-origem..
A solução é SIMPLES, seria vc recriar o job passando um outro ID que não esteja em uso pra rotina de criação de jobs : vc conecta no banco-destino (usando a ferramenta de conexão que quiser, sqlplus, SQL Developer, TOAD, o que vc tiver/puder/quiser), logando com um usuário que ** tenha o privilégio ** necessário (pode ser o SYS), busca o próximo OBJECT_ID posterior ao último usado nesse banco e executa a rotina de criação passando esse OBJECT_ID que vc sabe que está sem uso… O código pra isso seria mais ou menos tipo :
DECLARE
v_object_id number;
BEGIN
SELECT MAX(OBJECT_ID)+1 INTO v_object_id FROM DBA_OBJECTS;
SYS.DBMS_IJOB.SUBMIT( JOB=> v_object_id, LUSER=> ‘PACAJUS_PROD’, PUSER=> ‘PACAJUS_PROD’, CUSER=> ‘PACAJUS_PROD’,
NEXT_DATE=> TO_DATE(‘2016-10-04 00:00:00’, ‘YYYY-MM-DD:HH24:MI:SS’),
INTERVAL=> ‘TRUNC(SYSDATE) + 1’, BROKEN=> FALSE, WHAT=> ‘GSH_DESAB_USUARIO_TEMPO_ACESSO;
END;===> SE a tal rotina ‘GSH_DESAB_USUARIO_TEMPO_ACESSO’ foi importada certinho E SE o tal usuário PACAJUS_PROD foi criado ok (confira isso no banco-destino), deve ser esse aqui o procedimento de Correção da falha de importação do tal job….
[]s
Chiappa
28 de outubro de 2016 at 9:12 pm #108493José Laurindo ChiappaModeratorHmmm… Olhando a minha resposta, Xô fazer uma correçãozinha de segurança nesse código : pra mais segurança, ao invés de assignar um ID geral, busque nesse banco qual o último ID assignado para um JOB de banco : troque o trecho :
SELECT MAX(OBJECT_ID)+1 INTO v_object_id FROM DBA_OBJECTS;
por :
SELECT MAX(JOB)+1 INTO v_object_id FROM DBA_JOBS;
Sacomé, Segurança em primeiro lugar…
[]s
Chiappa
-
AuthorPosts
- You must be logged in to reply to this topic.