Proceso de larga duración
Hola a todos,
tengo un procedimiento de pl/sql que tarda, cuando finaliza correctamente, unas dos horas. Los tengo programado con un job y a veces finaliza y otras se alarga y falla después de varias horas porque el servidor de oracle se apaga por las noches.
Cuando falla no sé porque falla y me gustaría saber cómo puedo hacer para tener algún indicio del problema que tengo. Trabajo con Oracle 10g.
Os pego el código por si alguien me puede echar una mano. En principio lo que hago es recorrer una tabla buscando un deteminado contenido. Lo estoy haciendo todo con sql develper. Cualquier cosa que necesitéis saber me lo decís y lo comento.
Muchas gracias de antemano.
Saludos.
create or replace
PROCEDURE ITA_SECURITY_LOG(logging IN BINARY_INTEGER := 0)
IS
CURSOR c1 IS
SELECT log0, day0, time0, source, eventid, type0, category, user0, computer, message
FROM ITA_SECURITYLOG
ORDER BY log0, day0;
crec C1%ROWTYPE;
CURSOR c2 IS
SELECT day0, time0, message
FROM ITA_SECURITYLOG
WHERE eventid = 4663;
crec2 C2%ROWTYPE;
charmessage VARCHAR2(4000);
charobject_type VARCHAR2(255);
charobject_name VARCHAR2(255);
charlogon_id VARCHAR2(255);
charhandle_id VARCHAR2(255);
characcesses VARCHAR2(255);
charsecurityid VARCHAR2(255);
charworkstation_name VARCHAR2(255);
characcount_name VARCHAR2(255);
intexiste INTEGER;
err_code NUMBER;
err_msg VARCHAR2(64);
BEGIN
OPEN c1;
LOOP
FETCH c1 INTO crec;
EXIT WHEN c1%NOTFOUND;
if crec.eventid = 4660 then –Borrado de archivos
charhandle_id := ita_campos(crec.message, ‘Handle ID’, 1, 1);
open c2;
loop
fetch c2 into crec2;
exit when c2%notfound;
–Con Handle ID relacionamos los registros
if ita_campos(crec2.message, ‘Handle ID’, 1, 1) = charhandle_id and
ita_campos(crec2.message, ‘Accesses’, 1, 1) like ‘%1537%’ then
charobject_type := ita_campos(crec2.message, ‘Object Type’, 1, 1);
charobject_name := ita_campos(crec2.message, ‘Object Name’, 1, 1);
end if;
end loop;
close c2;
INSERT INTO ITA_SECURITYLOG_1(log0, time0, source, eventid, type0, category, user0, computer, account_name,
account_domain, logOn_id, object_server, handle_id, object_type, object_name, message)
VALUES(crec.log0, crec.day0 || ‘ ‘ || crec.time0, crec.source, crec.eventid, crec.type0, crec.category, crec.user0, crec.computer,
ita_campos(crec.message, ‘Account Name’, 1, 1),
ita_campos(crec.message, ‘Account Domain’, 1, 1),
rtrim(ltrim(charlogon_id)),
ita_campos(crec.message, ‘Object Server’, 1, 1),
ita_campos(crec.message, ‘Handle ID’, 1, 1),
rtrim(ltrim(charobject_type)),
rtrim(ltrim(charobject_name)),
substr(crec.message, 1, instr(crec.message, ‘^’) – 1));
elsif crec.eventid = 5140 then –Acceso a recursos de red
INSERT INTO ITA_SECURITYLOG_1(log0, time0, source, eventid, type0, category, user0, computer, account_name, account_domain,
logOn_id, message, source_address, source_port, share_name)
VALUES(crec.log0, crec.day0 || ‘ ‘ || crec.time0, crec.source, crec.eventid, crec.type0, crec.category, crec.user0, crec.computer,
ita_campos(crec.message, ‘Account Name’, 1, 1),
ita_campos(crec.message, ‘Account Domain’, 1, 1),
ita_campos(crec.message, ‘Logon ID’, 1, 1),
rtrim(ltrim(substr(crec.message, 1, instr(crec.message, ‘^’) – 1))),
ita_campos(crec.message, ‘Source Address’, 1, 1),
ita_campos(crec.message, ‘Source Port’, 1, 1),
ita_campos(crec.message, ‘Share Name’, 1, 1)
);
elsif crec.eventid = 4624 then –Logon
charsecurityid := ita_campos(crec.message, ‘Security ID’, 1, 2);
charworkstation_name := ita_campos(crec.message, ‘Workstation Name’, 1, 1);
characcount_name := ita_campos(crec.message, ‘Account Name’, 1, 2);
if not charworkstation_name is null and charworkstation_name<>chr(9) and
charsecurityid not like ‘%NULL SID%’ and characcount_name not like ‘%ANONYMOUS LOGON%’ then
INSERT INTO ITA_SECURITYLOG_1(log0, time0, source, eventid, type0, category, user0, computer, account_name,
account_domain, logOn_id, workstation_name, source_network_address, share_name, accesses, message)
VALUES(crec.log0, crec.day0 || ‘ ‘ || crec.time0, crec.source, crec.eventid, crec.type0, crec.category, crec.user0, crec.computer,
characcount_name,
ita_campos(crec.message, ‘Account Domain’, 1, 2),
ita_campos(crec.message, ‘Logon ID’, 1, 2),
ita_campos(crec.message, ‘Workstation Name’, 1, 1),
ita_campos(crec.message, ‘Source Network Address’, 1, 1),
charsecurityid,
charworkstation_name,
substr(crec.message, 1, instr(crec.message, ‘^’) – 1));
end if;
elsif crec.eventid = 4634 then –Logon
–Buscamos si el Logon Id nos lo habiamos guardado.
charlogon_id := ita_campos(crec.message, ‘Logon ID’, 1, 1);
SELECT count(*) INTO intexiste
FROM ita_securitylog_1
WHERE logon_id like concat(concat(‘%’, charlogon_id), ‘%’) and
eventid = 4624;
if intexiste = 1 then
INSERT INTO ITA_SECURITYLOG_1(log0, time0, source, eventid, type0, category, user0, computer, account_name,
account_domain, logon_id, message)
VALUES(crec.log0, crec.day0 || ‘ ‘ || crec.time0, crec.source, crec.eventid, crec.type0, crec.category, crec.user0, crec.computer,
ita_campos(crec.message, ‘Account Name’, 1, 1),
ita_campos(crec.message, ‘Account Domain’, 1, 1),
charlogon_id,
substr(crec.message, 1, instr(crec.message, ‘^’) – 1));
end if;
end if;
END LOOP;
COMMIT;
CLOSE c1;
delete ita_securitylog;
delete ita_securitylog_1
where share_name like ‘%\\*\IPC$%’
or account_name like ‘%ITACA-SPROTEO$%’
or account_name like ‘%ITACA-SLOTUS$%’
or account_name like ‘%ANONYMOUS LOGON%’
or account_name like ‘%Administrador%’
or account_name like ‘%administrador%’;
commit;
EXCEPTION
WHEN OTHERS THEN
err_code := SQLCODE;
err_msg := substr(SQLERRM, 1, 64);
DBMS_OUTPUT.put_line(‘Error:’||TO_CHAR(err_code));
DBMS_OUTPUT.put_line(err_msg);
INSERT INTO ita_audit_table (error_number, error_message, hora)
VALUES (err_code, err_msg, SYSTIMESTAMP);
END ITA_SECURITY_LOG;