feat(oracle): kit de instalare la client + corectarea lipsurilor din instalare

Blocul de instalare/migrare Oracle 21c XE, terminat si validat pe VM 302.

Kit de instalare (nou)

  scripts/build-client-kit.ps1 exporta CONTAFIN_ORACLE si FIRMANOUA de pe
  LXC 108 (PDB ROA2, nu ROA - ROA e productia ROA_CENTRAL), le aduce local
  prin cele trei hopuri container -> LXC -> host -> statie, le redenumeste la
  numele pe care le asteapta scripturile si le impacheteaza cu o copie a
  directorului roa-windows-setup. Citeste logul expdp si raporteaza cate
  firme are NOM_FIRME, ca sa nu plece din greseala datele unui client.

  roa-windows-setup/INSTALEAZA.cmd ruleaza pasii 01..08 fara "set /p", deci
  merge si prin SSH - RunAll.cmd nu poate fi rulat neinteractiv. Trateaza
  corect codul 5 de la pasul 03 si se opreste la prima eroare reala.

Corectii

  01-setup-database.ps1 nu mai scrie SQLNET.RECV_TIMEOUT / SEND_TIMEOUT in
  sqlnet.ora. Le hardcoda la 30 s, iar fisierul e citit si de impdp: in timpul
  unui import serverul poate lucra minute fara sa trimita un pachet, clientul
  murea cu ORA-12609 iar scriptul raporta esec pentru un import care se
  terminase cu bine pe server. Reprodus si reparat pe VM 302.

  01-setup-database.ps1: Step 4c optional (-ResetSystemPassword) care curata
  EXPIRED(GRACE) pe SYSTEM in CDB root; ALTER PROFILE opreste expirarile
  viitoare dar nu reseteaza un cont deja intrat in gratie.

  uninstall-roa.sql: retry la DROP USER dupa KILL SESSION, plus un bloc final
  de verdict care numara ce a ramas si iese cu ORA-20900 daca baza nu e
  curata. Pana acum toate sectiunile prindeau exceptiile in WHEN OTHERS si
  scriptul tiparea "UNINSTALL COMPLETE" chiar si cand un user supravietuise,
  iar instalarea urmatoare dadea ORA-31684 in lant. 99-uninstall-roa.ps1
  propaga codul de iesire.

  08-post-install-config.ps1: Step 7b seteaza SMTP_OUT_SERVER si ACL-ul de
  retea pentru CONTAFIN_ORACLE. UTL_MAIL se instala si primea EXECUTE, adica
  destul cat sa compileze, dar nu si cat sa trimita. Privilegiul resolve nu
  accepta interval de porturi (ORA-24244), deci se acorda separat de connect.

  07-verify-installation.ps1: sectiune noua care verifica prezenta lui
  FIRMANOUA.dmp in DMPDIR si o raporteaza ca eroare daca lipseste. Fara el,
  adaugarea unei firme noi pica in DBMS_DATAPUMP.ADD_FILE peste luni de la
  instalare, cand nimeni nu mai leaga eroarea de instalare.

  configure-profile.sql: antetul spune ca e unealta de remediere manuala, nu
  parte din flux; pas nou la final pentru CDB root.

Documentatie

  README-ul roa-windows-setup descrie acum explicit cele doua scenarii -
  instalare pe curat si migrare - de unde se iau DMP-urile sablon, si capcana
  ORA-12609. Handoff-urile de sesiune au fost sterse; ce era durabil in ele a
  intrat in README-uri si in docs/diagnostic-spatiu-clienti.md.

Validare pe VM 302: ciclu complet din kit, instalare pe curat, verificarea
finala "[OK] All checks passed!".

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SzF1hf4aFS1tmJWpPMiwGp
This commit is contained in:
Marius
2026-08-25 18:05:56 +03:00
parent 3a7e751fc1
commit 7fce925349
17 changed files with 3329 additions and 1753 deletions

View File

@@ -94,7 +94,8 @@ DECLARE
)
)
ORDER BY username;
v_count NUMBER := 0;
v_count NUMBER := 0;
v_failed NUMBER := 0;
BEGIN
FOR r IN c_users LOOP
BEGIN
@@ -107,10 +108,30 @@ BEGIN
v_count := v_count + 1;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(' ERROR: ' || SQLERRM);
-- O sesiune agatata tine userul ocupat (ORA-01940 "cannot drop a
-- user that is currently connected"). Prima incercare poate pica
-- inainte ca ALTER SYSTEM KILL SESSION sa fi terminat efectiv.
-- Mai incercam o data; ce ramane e raportat si prins de
-- verificarea finala, care iese cu cod de eroare.
DBMS_OUTPUT.PUT_LINE(' WARN (incercarea 1): ' || SQLERRM);
BEGIN
roa_kill_user_sessions(r.username);
DBMS_SESSION.SLEEP(3);
EXECUTE IMMEDIATE 'DROP USER ' || r.username || ' CASCADE';
DBMS_OUTPUT.PUT_LINE(' Dropped user (retry): ' || r.username);
v_count := v_count + 1;
EXCEPTION
WHEN OTHERS THEN
v_failed := v_failed + 1;
DBMS_OUTPUT.PUT_LINE(' ERROR: ' || r.username ||
' NU a fost sters: ' || SQLERRM);
END;
END;
END LOOP;
DBMS_OUTPUT.PUT_LINE('Total company users dropped: ' || v_count);
IF v_failed > 0 THEN
DBMS_OUTPUT.PUT_LINE('ATENTIE: ' || v_failed || ' user(i) de firma NU au fost stersi.');
END IF;
END;
/
@@ -137,8 +158,18 @@ BEGIN
END;
-- Now drop the user
EXECUTE IMMEDIATE 'DROP USER CONTAFIN_ORACLE CASCADE';
DBMS_OUTPUT.PUT_LINE(' User CONTAFIN_ORACLE dropped successfully.');
BEGIN
EXECUTE IMMEDIATE 'DROP USER CONTAFIN_ORACLE CASCADE';
DBMS_OUTPUT.PUT_LINE(' User CONTAFIN_ORACLE dropped successfully.');
EXCEPTION
WHEN OTHERS THEN
-- Acelasi motiv ca la sectiunea 1: sesiune inca vie.
DBMS_OUTPUT.PUT_LINE(' WARN (incercarea 1): ' || SQLERRM);
roa_kill_user_sessions('CONTAFIN_ORACLE');
DBMS_SESSION.SLEEP(3);
EXECUTE IMMEDIATE 'DROP USER CONTAFIN_ORACLE CASCADE';
DBMS_OUTPUT.PUT_LINE(' User CONTAFIN_ORACLE dropped successfully (retry).');
END;
ELSE
DBMS_OUTPUT.PUT_LINE(' User CONTAFIN_ORACLE does not exist.');
END IF;
@@ -170,7 +201,7 @@ DECLARE
'PACK_UTILS_FILE', 'PACK_ROARTVAI', 'RTVAI_AGENTI', 'RTVAI_ISTORIC',
'FF_SUME', 'FF_PERSINTRET', 'VANZARI_DETALII_TAB', 'PIVOT_TABLE',
'PIVOT_ROW', 'TABINCHIDERETVA', 'TABELAVALORITAGURI',
'RANDINCHIDERETVA', 'SERVER_INFO'
'RANDINCHIDERETVA', 'SERVER_INFO', 'EXECUTESCRIPTOS'
)
OR synonym_name LIKE 'SYN_%');
v_count NUMBER := 0;
@@ -344,10 +375,100 @@ PROMPT
PROMPT Tablespace ROA:
SELECT tablespace_name, status FROM dba_tablespaces WHERE tablespace_name = 'ROA';
PROMPT
PROMPT ============================================================
PROMPT ROA UNINSTALL COMPLETE
PROMPT ============================================================
PROMPT
PROMPT Database is now clean. You can re-run the setup scripts.
PROMPT
-- ============================================================================
-- VERDICT: verificare autoritara, cu cod de iesire
-- ============================================================================
-- Toate sectiunile de mai sus prind exceptiile in WHEN OTHERS si doar scriu in
-- DBMS_OUTPUT, ca sa nu opreasca dezinstalarea la primul obstacol. Consecinta:
-- scriptul se termina "cu succes" chiar daca un user a supravietuit, iar
-- instalarea urmatoare pica in lant cu ORA-31684 ... already exists.
-- Blocul asta numara ce a ramas si iese cu cod de eroare daca nu e curat.
-- Pas 1: raportarea (nu poate pica scriptul, deci output-ul ajunge pe ecran).
DECLARE
v_users NUMBER := 0;
v_contafin NUMBER := 0;
v_sysobj NUMBER := 0;
v_syn NUMBER := 0;
v_tbs NUMBER := 0;
v_total NUMBER := 0;
v_msg VARCHAR2(4000) := '';
BEGIN
SELECT COUNT(*) INTO v_users
FROM dba_users
WHERE default_tablespace = 'ROA'
AND username <> 'CONTAFIN_ORACLE';
SELECT COUNT(*) INTO v_contafin
FROM dba_users WHERE username = 'CONTAFIN_ORACLE';
SELECT COUNT(*) INTO v_sysobj
FROM dba_objects
WHERE owner = 'SYS'
AND object_name IN (
'AUTH_PACK', 'AUTH_DETALII', 'AUTH_SERII', 'VAUTH_SERII',
'EXECUTESCRIPTOS', 'NEWSCHEMA', 'NEWSCHEMAJOB', 'UPDATESQLPLUS',
'PINFO', 'INFO', 'SEQ_AUTH_SERII');
SELECT COUNT(*) INTO v_syn
FROM dba_synonyms
WHERE owner = 'PUBLIC' AND table_owner = 'CONTAFIN_ORACLE';
SELECT COUNT(*) INTO v_tbs
FROM dba_tablespaces WHERE tablespace_name = 'ROA';
IF v_users > 0 THEN v_msg := v_msg || v_users || ' user(i) de firma; '; END IF;
IF v_contafin > 0 THEN v_msg := v_msg || 'CONTAFIN_ORACLE; '; END IF;
IF v_sysobj > 0 THEN v_msg := v_msg || v_sysobj || ' obiecte SYS; '; END IF;
IF v_syn > 0 THEN v_msg := v_msg || v_syn || ' sinonime publice; '; END IF;
IF v_tbs > 0 THEN v_msg := v_msg || 'tablespace ROA; '; END IF;
v_total := v_users + v_contafin + v_sysobj + v_syn + v_tbs;
IF v_total = 0 THEN
DBMS_OUTPUT.PUT_LINE('============================================================');
DBMS_OUTPUT.PUT_LINE(' ROA UNINSTALL COMPLETE');
DBMS_OUTPUT.PUT_LINE('============================================================');
DBMS_OUTPUT.PUT_LINE('Baza este curata. Poti relua scripturile de instalare.');
ELSE
DBMS_OUTPUT.PUT_LINE('============================================================');
DBMS_OUTPUT.PUT_LINE(' ROA UNINSTALL INCOMPLET');
DBMS_OUTPUT.PUT_LINE('============================================================');
DBMS_OUTPUT.PUT_LINE('Au ramas: ' || RTRIM(v_msg, '; '));
DBMS_OUTPUT.PUT_LINE('Cauza uzuala: o sesiune activa tinea userul ocupat.');
DBMS_OUTPUT.PUT_LINE('Inchide aplicatia ROA / sesiunile sqlplus si ruleaza din nou.');
DBMS_OUTPUT.PUT_LINE('NU porni instalarea acum - pasul 05 va da ORA-31684 in lant.');
END IF;
END;
/
-- Pas 2: verdictul propriu-zis. Recalculeaza acelasi total si iese cu cod de
-- eroare daca nu e zero. Diagnosticul detaliat e deja tiparit mai sus.
WHENEVER SQLERROR EXIT FAILURE
DECLARE
v_total NUMBER;
BEGIN
SELECT (SELECT COUNT(*) FROM dba_users
WHERE default_tablespace = 'ROA' AND username <> 'CONTAFIN_ORACLE')
+ (SELECT COUNT(*) FROM dba_users WHERE username = 'CONTAFIN_ORACLE')
+ (SELECT COUNT(*) FROM dba_objects
WHERE owner = 'SYS'
AND object_name IN (
'AUTH_PACK', 'AUTH_DETALII', 'AUTH_SERII', 'VAUTH_SERII',
'EXECUTESCRIPTOS', 'NEWSCHEMA', 'NEWSCHEMAJOB', 'UPDATESQLPLUS',
'PINFO', 'INFO', 'SEQ_AUTH_SERII'))
+ (SELECT COUNT(*) FROM dba_synonyms
WHERE owner = 'PUBLIC' AND table_owner = 'CONTAFIN_ORACLE')
+ (SELECT COUNT(*) FROM dba_tablespaces WHERE tablespace_name = 'ROA')
INTO v_total
FROM dual;
IF v_total > 0 THEN
RAISE_APPLICATION_ERROR(-20900,
'ROA UNINSTALL INCOMPLET - au ramas ' || v_total ||
' obiect(e). Vezi raportul de mai sus.');
END IF;
END;
/
EXIT SUCCESS