Ștergerea definitivă a entităților — PurgeDeletedEntitiesRfc

Acesta este un instrument pentru SUPERUTILIZATORI și necesită cunoașterea bazei de date și a modelelor. Utilizați-l cu atenție!

Toate entitățile, cu excepția tabelelor JOIN generate automat, au un indicator IsDeleted pentru ștergerea logică. Când acesta este true, entitatea nu mai apare în sistem, dar rămâne în baza de date. Înregistrările JOIN și referințele prin chei externe, inclusiv din entități active, continuă să utilizeze un Id valid. Eliminarea definitivă a entităților care nu mai sunt necesare eliberează spațiu în baza de date.

În arhitectura distribuită descrisă de acest articol, aplicația de bază nu cunoaște toate referințele din plug-in-uri. Din acest motiv, verificările locale nu pot preveni toate ștergerile logice ale entităților referite în alte module. Instrumentul este destinat curățării datelor acumulate.

Funcționalitatea elimină definitiv (hard delete) TOATE entitățile de tipul selectat care sunt șterse logic, având IsDeleted activ.

AVERTISMENT: Folosiți instrumentul numai pentru entități pe care nu mai trebuie să le restaurați.

AVERTISMENT: Executarea programului șterge definitiv din baza de date TOATE înregistrările vizate care au indicatorul IsDeleted activ.

Cum funcționează

Introduceți în EntityTypeName numele tipului de entitate și apăsați Next. Dacă bifați RemoveJoinTableReferences, sunt raportate și înregistrările care referă cheia primară a entității, cu condiția completării corecte a schemei, tabelului și coloanei de cheie externă.

Dacă tipul este identificat, câmpurile doar pentru citire FullTypeName, Schema și Table afișează entitatea găsită. Verificați-le înainte de a continua.

Sistemul caută entitățile șterse logic și afișează numărul înregistrărilor propuse pentru ștergere definitivă. Apăsarea Execute încearcă eliminarea lor din baza de date.

Dacă cheia primară a unei înregistrări este încă utilizată drept cheie externă, baza de date poate împiedica ștergerea.

Înainte de a continua, trebuie rezolvate înregistrările care referă cheile primare ale entităților vizate.

AVERTISMENT: Căutarea referințelor la cheia primară verifică TOATE înregistrările, șterse logic sau active.

Eliminarea dependențelor din tabelele de legătură

Dacă alte tabele conțin chei externe către entitățile vizate, acestea nu pot fi șterse până când referințele sunt eliminate sau înregistrările dependente sunt, la rândul lor, șterse definitiv.

Pentru o eroare precum cea ilustrată, completați JoinTableName cu tabelul care conține referința (BarCode în exemplu), JoinForeignKeyColumnName cu numele coloanei de cheie externă (ProductDefinitionId, identificabil și în numele constrângerii) și JoinTableSchemaName cu schema tabelului respectiv.

Denumirile uzuale ale coloanelor de cheie externă descrise în ghid sunt:

  • ChildrenId — relație unu-la-unu între entități de același tip;
  • ParentId — relație unu-la-unu între entități de același tip;
  • ChildrensId — relație mai-multe-la-mai-multe între entități de același tip;
  • ParentsId — relație mai-multe-la-mai-multe între entități de același tip;
  • <main entity name>Id — referință la altă entitate, când sunt respectate convențiile de denumire.

Mai multe tipuri de entități pot referi aceeași entitate. Pașii trebuie repetați pentru fiecare dependență înaintea eliminării definitive.

Și entitățile active pot referi entități șterse logic. În acest caz, referința trebuie eliminată sau modificată manual ori entitatea dependentă trebuie ștearsă logic, dacă operația este justificată. După ștergerea logică prin funcționalitatea de acces la date, aceasta poate fi identificată între referințele JOIN.

Dependențe față de entități active

Dacă entitățile șterse logic sunt referite de entități active care au, la rândul lor, referințe, instrumentul nu poate rezolva automat întregul lanț. Dacă entitățile active nu sunt referite, ele pot fi tratate similar înregistrărilor din tabelele JOIN.

Pentru identificarea acestor dependențe, rulați FindReferencesToDeletedRecordsRfc, apoi analizați și rezolvați manual referințele.

Raportul încearcă să afișeze detalii din coloanele Name, Description și Note, dacă acestea există în tipul de date care conține referința.

ParentId reprezintă Id-ul entității active care face referința, iar ChildId reprezintă Id-ul entității șterse logic.

Ce nu face acest instrument

Pentru filtrarea și ștergerea doar a anumitor înregistrări este necesar un RFC propriu. Instrumentul descris elimină toate entitățile șterse logic din selecția de tip.

Deoarece ștergerea logică este implementată în nucleul sistemului, iar instrumentul trebuie să poată accesa generic entitățile, ghidul nu utilizează IgnoreQueryFilters() pentru ocolirea acestui comportament. Implementarea descrisă folosește acces direct prin DbContext.Database.ExecuteSqlRawAsync() sau DbContext.Database.GetDbConnection().CreateCommand() și necesită cunoștințe SQL.