Files
Marius ec66377e0f fix(oracle): calea DMPDIR devine parametru; sqlnet.ora ajunge unde e citit
Gasite la instalarea de productie VADECO (Oracle 21c XE, Windows Server 2019).

1. Pe serverul VADECO procesul Oracle nu poate atinge nicio cale de pe C:,
   nici macar C:\Windows\Temp, desi ACL-urile sunt corecte si serviciul ruleaza
   ca NT SERVICE\OracleServiceXE. D: merge cu exact acelasi grant. Calea DMP
   era insa hardcodata "C:\DMPDIR" in 01, 02, 05, 06 si in biblioteca, deci
   instalarea nu se putea muta. Acum e parametrul -DmpDir, expus ca /dmpdest:
   in FAZA1.cmd si FAZA2.cmd si transmis tuturor pasilor.

   Cel mai perfid era pasul 02: recrea DIRECTORY DMPDIR pe 'C:\DMPDIR' peste
   valoarea pusa de 01. Chiar cu restul instalarii mutata, SYS.NEWSCHEMA ar fi
   cautat FIRMANOUA.dmp in alta parte, iar adaugarea unei firme noi ar fi picat
   peste luni, fara legatura vizibila cu instalarea.

2. New-OracleDirectory compara doar siruri de caractere: verifica ce scrie in
   dba_directories, nu daca baza chiar poate scrie acolo. Acum face un
   UTL_FILE round-trip si esueaza pe loc, cu explicatia cauzei. Inainte,
   directorul inutilizabil trecea drept bun si importul cadea abia in impdp cu
   ORA-29283, la zeci de linii distanta. Valoarea de retur nici nu era
   verificata in 01/03/06 - de aici si "True" ratacit in log.

3. Instalarea ROAClient seteaza TNS_ADMIN de masina spre instantclient-ul ei.
   Serviciul Oracle mosteneste variabilele de masina, deci citea sqlnet.ora de
   acolo - unde nu exista niciunul - si nu din Oracle Home, unde il scria pasul
   01. Compatibilitatea pentru clienti vechi nu se aplica, iar statiile ar fi
   primit ORA-28040 cu fisierul scris corect, in locul gresit. Pasul 01 scrie
   acum sqlnet.ora si in TNS_ADMIN cand difera.

4. Pasul 05 lega schemele de DMP-uri cu "^$schema[_\.]", deci schema DANUBE
   putea primi DANUBE_20200914.dmp - datele altei firme, fara avertisment.
   Numele exact are acum intaietate, prefixul se accepta doar daca e unic, iar
   ambiguitatea se raporteaza.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SzF1hf4aFS1tmJWpPMiwGp
2026-08-25 21:18:43 +03:00

287 lines
11 KiB
Batchfile

@echo off
REM =============================================================================
REM ROA Oracle - FAZA 2: dupa ce utilizatorii au terminat de lucrat
REM =============================================================================
REM Aduce datele reale ale clientului peste sistemul deja instalat si
REM configurat de FAZA1.cmd. Asta e fereastra de downtime; tine-o scurta.
REM
REM Ce face:
REM - optional, reimporta CONTAFIN_ORACLE de pe serverul vechi (/reimportcontafin)
REM prin DROP USER CASCADE + recreare + import curat
REM - importa schemele de firma din DMPDIR (05)
REM - reface SERVER_INFO, directoarele si joburile (08)
REM - regenereaza schema.txt pentru exportul zilnic (11 -SchemaOnly)
REM - verifica (07)
REM
REM DE CE se reia pasul 08:
REM SERVER_INFO e o TABELA in CONTAFIN_ORACLE, nu in SYS. Cand vine
REM contafin-ul clientului peste, aduce cu el SERVER_INFO de pe serverul
REM VECHI - cai vechi, parole vechi, SMTP vechi. Fara reluarea pasului 08,
REM actualizarile ar cauta fisiere pe calea serverului vechi.
REM
REM Utilizare:
REM FAZA2.cmd <IdClient> [optiuni]
REM
REM Optiuni:
REM /reimportcontafin inlocuieste CONTAFIN_ORACLE cu cel din DMPDIR
REM /smtp:<server> server SMTP (implicit mail.romfast.ro)
REM /roaupdate:<cale> radacina oglinzii (implicit D:\ROAUPDATE)
REM /export:<cale> director export (implicit D:\ROA\EXPORT_ORADMP)
REM /dmp:<cale> de unde se copiaza DMP-urile (implicit <kit>\DMPDIR)
REM /dmpdest:<cale> de unde le citeste baza (implicit C:\DMPDIR)
REM Trebuie sa fie aceeasi valoare ca la FAZA1.
REM /faraschema nu regenera schema.txt
REM
REM Exemple:
REM FAZA2.cmd 138
REM FAZA2.cmd 138 /reimportcontafin
REM FAZA2.cmd 214 /dmp:E:\export-client /reimportcontafin
REM =============================================================================
setlocal enabledelayedexpansion
set "KIT=%~dp0"
set "IDCLIENT=%~1"
set "DMPDEST=C:\DMPDIR"
set "SMTP=mail.romfast.ro"
set "ROAUPDATE=D:\ROAUPDATE"
set "EXPORTDIR=D:\ROA\EXPORT_ORADMP"
set "DMPSURSA=%KIT%DMPDIR"
set "REIMPORT=0"
set "FARASCHEMA=0"
if "%IDCLIENT%"=="" goto :utilizare
if /i "%IDCLIENT%"=="/?" goto :utilizare
shift
:parsare
if "%~1"=="" goto :parsare_gata
set "ARG=%~1"
if /i "!ARG!"=="/reimportcontafin" ( set "REIMPORT=1" & shift & goto :parsare )
if /i "!ARG!"=="/faraschema" ( set "FARASCHEMA=1" & shift & goto :parsare )
for /f "tokens=1,* delims=:" %%A in ("!ARG!") do (
set "OPT=%%A"
set "VAL=%%B"
)
REM "tokens=1,*" pastreaza in %%B tot ce urmeaza dupa PRIMUL ':', inclusiv
REM ':' din caile de tip D:\ROAUPDATE. Deci /roaupdate:D:\ROAUPDATE ajunge
REM corect ca OPT=/roaupdate, VAL=D:\ROAUPDATE.
if /i "!OPT!"=="/smtp" set "SMTP=!VAL!"
if /i "!OPT!"=="/roaupdate" set "ROAUPDATE=!VAL!"
if /i "!OPT!"=="/export" set "EXPORTDIR=!VAL!"
if /i "!OPT!"=="/dmp" set "DMPSURSA=!VAL!"
if /i "!OPT!"=="/dmpdest" set "DMPDEST=!VAL!"
shift
goto :parsare
:parsare_gata
echo.
echo ============================================================
echo ROA Oracle - FAZA 2 (dupa program)
echo ============================================================
echo.
echo Id client: %IDCLIENT%
echo DMP sursa: %DMPSURSA%
echo DMP tinta: %DMPDEST%
echo ROAUPDATE: %ROAUPDATE%
echo Export: %EXPORTDIR%
if "%REIMPORT%"=="1" (
echo CONTAFIN: SE REIMPORTA ^(drop user cascade^)
) else (
echo CONTAFIN: se pastreaza cel din faza 1
)
echo.
REM ---------------------------------------------------------------------------
REM [1/6] DMP-urile firmelor
REM ---------------------------------------------------------------------------
if not exist "%DMPSURSA%" (
echo [EROARE] Directorul sursa "%DMPSURSA%" nu exista.
exit /b 1
)
set /a TOTALDMP=0
for %%F in ("%DMPSURSA%\*.dmp") do set /a TOTALDMP+=1
if !TOTALDMP! EQU 0 (
echo [EROARE] Nu am gasit niciun fisier .dmp in "%DMPSURSA%".
exit /b 1
)
REM Kitul contine 2 sabloane: *contafin*.dmp si FIRMANOUA.dmp. Orice peste 2
REM sunt DMP-urile de firma ale clientului.
if !TOTALDMP! LEQ 2 (
echo [ATENTIE] In "%DMPSURSA%" sunt doar !TOTALDMP! fisiere DMP, adica doar
echo sabloanele. Faza 2 are rost doar cu DMP-urile firmelor.
echo Exporta-le de pe serverul vechi si pune-le acolo.
echo.
echo Continui oricum - pasul 05 va raporta ce lipseste.
echo.
)
if not exist "%DMPDEST%" mkdir "%DMPDEST%"
echo [1/6] Copiez %TOTALDMP% fisiere DMP in %DMPDEST% ...
copy /Y "%DMPSURSA%\*.dmp" "%DMPDEST%\" >nul
if errorlevel 1 (
echo [EROARE] Copierea DMP-urilor a esuat.
exit /b 1
)
icacls "%DMPDEST%" /grant "NT SERVICE\OracleServiceXE:(OI)(CI)F" /T >nul 2>&1
echo Gata.
REM ---------------------------------------------------------------------------
REM [2/6] Reimportul lui CONTAFIN_ORACLE (optional)
REM ---------------------------------------------------------------------------
echo.
if "%REIMPORT%"=="0" (
echo [2/6] Reimport CONTAFIN_ORACLE - sarit.
echo Foloseste /reimportcontafin daca intre faze s-au adaugat firme
echo sau s-au modificat nomenclatoare pe serverul vechi.
goto :pas_05
)
echo [2/6] Reimport CONTAFIN_ORACLE
echo Se sterge schema existenta si se importa cea din %DMPDEST%.
echo.
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\drop-contafin.ps1" -Force -KillSessions
if errorlevel 1 goto :esec_drop
echo.
echo 01-setup-database.ps1 (recreare user)
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\01-setup-database.ps1" -DmpDir "%DMPDEST%"
if errorlevel 1 goto :esec_01
echo.
echo 03-import-contafin.ps1
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\03-import-contafin.ps1" -DmpDir "%DMPDEST%"
set RC=!ERRORLEVEL!
if "!RC!"=="0" goto :dupa_03
if "!RC!"=="5" (
echo [INFO] Cod de iesire 5 - normal pentru Data Pump, se continua.
goto :dupa_03
)
echo [EROARE] 03-import-contafin.ps1 a iesit cu codul !RC!.
exit /b !RC!
:dupa_03
echo.
echo 04-create-synonyms-grants.ps1
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\04-create-synonyms-grants.ps1"
if errorlevel 1 goto :esec_04
:pas_05
REM ---------------------------------------------------------------------------
REM [3/6] Schemele de firma
REM ---------------------------------------------------------------------------
echo.
echo [3/6] 05-import-companies.ps1
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\05-import-companies.ps1" -DumpDirectory "%DMPDEST%" -DmpDir "%DMPDEST%"
if errorlevel 1 goto :esec_05
REM ---------------------------------------------------------------------------
REM [4/6] Reconfigurare post-import
REM ---------------------------------------------------------------------------
echo.
echo [4/6] 08-post-install-config.ps1 (reluare)
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\08-post-install-config.ps1" -CustomerId "%IDCLIENT%" -EmailSmtp "%SMTP%" -RoaUpdatePath "%ROAUPDATE%"
if errorlevel 1 goto :esec_08
REM ---------------------------------------------------------------------------
REM [5/6] schema.txt pentru exportul zilnic
REM ---------------------------------------------------------------------------
echo.
if "%FARASCHEMA%"=="1" (
echo [5/6] schema.txt - sarit ^(/faraschema^)
) else (
echo [5/6] 11-setup-backup-export.ps1 -SchemaOnly
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\11-setup-backup-export.ps1" -ExportPath "%EXPORTDIR%" -SchemaOnly
if errorlevel 1 (
echo [ATENTIE] Nu am putut regenera schema.txt. Exportul zilnic va
echo exporta lista veche. Reia cu:
echo Run.cmd 11-setup-backup-export.ps1 -SchemaOnly
)
)
REM ---------------------------------------------------------------------------
REM [6/6] Verificare
REM ---------------------------------------------------------------------------
echo.
echo [6/6] 07-verify-installation.ps1
powershell.exe -ExecutionPolicy Bypass -NoProfile -File "%KIT%scripts\07-verify-installation.ps1"
set RCVERIF=!ERRORLEVEL!
echo.
echo ============================================================
if "!RCVERIF!"=="0" (
echo FAZA 2 COMPLETA - verificarea a trecut integral.
) else (
echo FAZA 2 TERMINATA, DAR VERIFICAREA A SEMNALAT PROBLEME.
echo.
echo "N company schemas are missing" inseamna ca lipsesc DMP-urile
echo firmelor respective. Copiaza-le in %DMPDEST% si reia doar pasul 05:
echo Run.cmd 05-import-companies.ps1
)
echo ============================================================
echo.
echo INAINTE SA PLECI DE LA CLIENT:
echo.
echo 1. Pasul 08 a RECREAT joburile de actualizare, dezactivate.
echo Daca trebuie sa mearga, activeaza-le:
echo EXEC DBMS_SCHEDULER.ENABLE('CONTAFIN_ORACLE.UPDATEROA_ZILNIC');
echo EXEC DBMS_SCHEDULER.ENABLE('CONTAFIN_ORACLE.UPDATERTVAI_ZILNIC');
echo.
echo 2. Verifica oglinda de update: http://localhost/roaupdate/
echo.
echo 3. Ruleaza o data exportul, sa vezi ca scrie:
echo Start-ScheduledTask -TaskName "ROA Export Oracle"
echo.
echo 4. NU sterge FIRMANOUA.dmp din %DMPDEST% - e folosit la fiecare
echo firma noua, oricand pe viitor.
echo.
echo 5. Opreste serverul VECHI sau cel putin listener-ul, ca sa nu se
echo conecteze cineva din greseala la datele vechi.
echo.
endlocal & exit /b %RCVERIF%
REM ---------------------------------------------------------------------------
:esec_drop
echo [EROARE] Nu am putut sterge CONTAFIN_ORACLE. Faza 2 se opreste.
echo Verifica daca mai are sesiuni deschise:
echo SELECT sid, serial#, program FROM v$session WHERE username = 'CONTAFIN_ORACLE';
exit /b 1
:esec_01
echo [EROARE] 01-setup-database.ps1 a esuat. Faza 2 se opreste.
exit /b 1
:esec_04
echo [EROARE] 04-create-synonyms-grants.ps1 a esuat. Faza 2 se opreste.
exit /b 1
:esec_05
echo [EROARE] 05-import-companies.ps1 a esuat. Faza 2 se opreste.
exit /b 1
:esec_08
echo [EROARE] 08-post-install-config.ps1 a esuat. Faza 2 se opreste.
exit /b 1
:utilizare
echo.
echo Utilizare:
echo FAZA2.cmd ^<IdClient^> [optiuni]
echo.
echo Optiuni:
echo /reimportcontafin inlocuieste CONTAFIN_ORACLE cu cel din DMPDIR
echo /smtp:^<server^> server SMTP ^(implicit mail.romfast.ro^)
echo /roaupdate:^<cale^> radacina oglinzii ^(implicit D:\ROAUPDATE^)
echo /export:^<cale^> director export ^(implicit D:\ROA\EXPORT_ORADMP^)
echo /dmp:^<cale^> de unde se copiaza DMP-urile
echo /faraschema nu regenera schema.txt
echo.
echo Faza 2 se ruleaza DUPA FAZA1.cmd, cand utilizatorii au terminat de lucrat.
echo.
exit /b 2