7.3 KiB
; e aruncata tacut de SQL*Plus, un NN refolosit colizioneaza intre prefixe, iar o constructie 11g+ pica doar la clientul pe Oracle 10.2. Cere compatibilitate 10.2, idempotenta si sursa de referinta MARIUSM_AUTO.
roa-oracle-migration
Scrie scripturi de migrare Oracle si publica-le catre clienti. Detalii de context: vezi Referinta, doar cand ramura o cere.
Cand se foloseste
- schimbi schema: tabela, view, procedura, functie sau pachet;
- iti trebuie o coloana noua / index / constrangere pe un obiect existent;
- scrii un script nou in
D:\ROA\DATABASE\SCRIPTURI_CLAR; - adaugi o optiune de meniu sau un drept (
co_..._OBIECTE.sql); - publici scripturile catre clienti (import in
UPD_DATABASE+ arhiva lunara); - re-exporti sursa unui pachet PL/SQL sau citesti un corp de pachet (
oracle_export.md).
Un agent scrie scriptul, nu il aplica. Rularea pe o schema se face doar la cererea explicita a lui Marius.
Pasi
-
Scripturile stau in
SCRIPTURI_CLAR\YYYY\MM\, nu direct inSCRIPTURI_CLAR. Cauta intai un script precedent pe aceeasi tabela (grep -ril "<tabela>" D:/ROA/DATABASE/SCRIPTURI_CLAR) si copiaza-i tiparul; cauta si valoarea/codul, ca sa nu adaugi ceva deja livrat. -
La schimbari de obiecte (pachet, view, tabela) confirma ca sursa de referinta
MARIUSM_AUTO(peROA_CENTRAL) e la zi: compara scripturile dinSCRIPTURI_CLARcu inregistrarile dinVERSIUNE. Daca lipseste vreunul, opreste-te si semnaleaza-i lui Marius. Nu porni de la sursa citita dintr-o schema de client. La un simplumergede date de referinta pasul nu e necesar. -
Alege numele
<prefix>_YYYY_MM_DD_NN_<subiect>.sql, in folderulYYYY\MMal datei. Prefixe in uz:ff,co,sys,ris,rf.NNe o secventa unica pe zi, comuna tuturor prefixelor (ls -R SCRIPTURI_CLAR | grep YYYY_MM_DD). -
Scrie scriptul ASCII, CRLF, scoped pe cazul tratat si idempotent (
merge,where <coloana> is null). Un pachet sta singur in scriptul lui, fara alt DDL/DML alaturi. -
Termina fiecare instructiune explicit cu
;(sau/pentru blocurile PL/SQL). -
Scrie la nivel Oracle 10.2 - numitorul comun al parcului de clienti. Proba se face pe serverul cel mai vechi (ROMCONSTRUCT), nu pe dev.
-
Incheie scriptul cu:
exec pack_migrare.UpdateVersiune('<nume_script>'); commit;Numele se da fara
.sql(extensia o adaugaUpdateVersiune).UpdateVersiunee DML: faracommitexplicit, versiunea nu se inregistreaza siVERSIUNEminte. -
Publica: intai
-DryRun, apoi fara, conformpublicare-scripturi-db.md:powershell -File D:\ROA\ROAFACTURARE\COMUN\utile\publicare_scripturi.ps1 -DryRun powershell -File D:\ROA\ROAFACTURARE\COMUN\utile\publicare_scripturi.ps1Publicarea = import al fiecarui
.sqlinCONTAFIN_ORACLE.UPD_DATABASE(peROA_CENTRAL) si regenarea arhivei lunare inY:\ROAUPDATE\_UPDATE\. Directorul e live. -
Dupa publicare, strange dovezile din "Criterii de acceptare si dovada".
Capcane
- O instructiune fara
;final e ARUNCATA fara nicio eroare. Prima linie goala inchide bufferul SQL*Plus; scriptul continua pana laUpdateVersiune, se marcheaza aplicat, iar obiectul ramane cel vechi.WHENEVER SQLERROR EXITnu prinde cazul. ;la capatul unei linii dintr-un comentariu--din interiorul unei instructiuni termina instructiunea acolo: restulCREATE VIEW-ului se interpreteaza linie cu linie (SP2-0734,ORA-00936derutant). Pune.in loc de;in comentariu. Comentariile de dinaintea instructiunii nu sunt afectate.NNse colizioneaza intre prefixe: acelasi numar nu se reia intr-un alt prefix in aceeasi zi. Un script deja inVERSIUNEnu se reaplica; corectia se livreaza ca script nou, cu data siNNnoi - nu prin republicarea aceluiasi fisier.- Constructiile 11g+/12c+ trec pe dev dar pica la clientul 10.2 (
REGEXP_COUNT,CONTINUE,LISTAGG,PIVOT,FETCH FIRST, identificatori peste 30 de caractere...). Detalii inscripturi-migrare-db.md. - Un obiect nu se poate referi la ceva creat de un script ulterior. Daca un script creeaza
tabela si altul pachetul care o foloseste, tabela are
NNmai mic. - LF in loc de CRLF sparge parsarea pe client (
ALINESpeCHR(13)+CHR(10)): tot fisierul devine un rand. Publicarea refuza fisierele LF. - DDL neprefixat merge pe schema conexiunii. Rularea manuala se face conectat pe schema
tinta (
CONTAFIN_ORACLEpentruco_, schema firmei pentruff_), niciodata pe un user de lucru.PACK_UPDATEface singurCONNECTpe schema corecta. linesizeprea mic corupe tacut exportul: SQL*Plus rupe liniile lungi, inclusiv prin mijlocul unui identificator. Folosestelinesize 32767; exportul e pentru citit, nu baza pentru un script de migrare.- Niciodata
selectde raportare in script,insertfaraID_OBIECTexplicit, sauID_GRUPfix (grupurile difera per client).
Criterii de acceptare si dovada
Fara dovada nu se spune "gata". Ruleaza si pastreaza iesirea:
- fisierul e ASCII pur (0 octeti > 127), fara BOM, cu CRLF;
- ultima linie a fiecarui
CREATE/ALTER/MERGEse termina cu;; - scriptul se termina cu
UpdateVersiune('<nume_fara_.sql>')urmat decommit;; NNe liber: nu exista rand inVERSIUNEsi nici fisier cu acelasidata||NN;- dupa aplicare,
select script_final from versiune where script_final = '<nume>.sql';intoarce randul si nu..._.sql.sql; publicare_scripturi.ps1 -DryRunlisteaza scripturile fara sa scrie; arhiva generata se citeste inapoi si se compara lungime + MD5 per fisier;- importul compara CLOB-ul citit inapoi octet cu octet cu fisierul.
Verificarea de ASCII + CRLF (trebuie sa intoarca 0 si True):
$b = [IO.File]::ReadAllBytes('D:\ROA\DATABASE\SCRIPTURI_CLAR\YYYY\MM\<script>.sql')
($b | Where-Object { $_ -gt 127 }).Count
($b -join ',').Contains('13,10')
Scripturi
-
D:\ROA\ROAFACTURARE\COMUN\utile\publicare_scripturi.ps1- publicare (import + arhiva). Optiuni:-DryRun,-Luna YYYY-MM,-Fisier a.sql,b.sql,-DoarImport,-DoarArhiva,-Toate. Nu copia scriptul - vezipublicare-scripturi-db.md. -
Incheierea obligatorie din fiecare script de migrare:
exec pack_migrare.UpdateVersiune('<nume_script_fara_.sql>'); commit; -
Export sursa pachet:
linesize 32767, apoi verifica sa nu existe linii la exactlinesize(oracle_export.md).
Referinta (doar la nevoie)
- Doar daca scrii un script nou sau ai dubii despre scheme si conectare, citeste
COMUN\docs\scripturi-migrare-db.mdsiCOMUN\docs\conventie_mediu_oracle.md.