Mutarea tablei - depășirea stivei în limba rusă

Am un tabel care se schimbă după inserarea / ștergerea unei linii. Aceasta este, mutația este că atunci când o inserați într-o masă, trebuie să recalculați valorile care sunt în alte rânduri. Am scris un declanșator, dar nu funcționează, apare o eroare. Problema, așa cum o înțeleg, apare atunci când există o încercare de accesare a unei mese în declanșarea nivelului rândului, care este modificat de aceeași propoziție. Care sunt motivele acestei erori? Și cum poți să o eviți? Și cum pot recalcula valorile tabelului la schimbarea unei linii (instert / delete)?







presetat 19 ianuarie '11 la 17:48

2 date4 date4 50

Faceți o inserție într-o masă, de exemplu:

câmp id1 câmp2 câmp3

1 date1 date2 30

2 date4 date4 50

3 date5 date6 70

Din cauza inserției, trebuie să faceți o actualizare, de exemplu, pentru toate câmpurile 3:

Problema este că efectuați acțiuni pe masa închisă (nu știu cum oracle, scriu despre mysql, cred că în oracol este același lucru), adică Datele nu pot fi actualizate, șterse sau modificate în timp ce tabela este blocată. În mysql, acesta este tabelul LOCK TABLE / UNLOCK. Deoarece inserarea nu este încă finalizată, tabela nu poate fi actualizată, pentru aceasta puteți merge invers - efectuați 2 solicitări, 1 adăugați, 2 actualizați. Este posibil ca în oracol să puteți verifica disponibilitatea pentru actualizarea tabelului și, de exemplu, în al doilea fir, să inserați actualizarea sau să așteptați până când tabelul este "eliberat", devenind astfel disponibil pentru actualizare. Sper că am ajutat cel puțin cumva.







răspuns dat la 19 ianuarie '11 la 21:43

Tu Alex Silaev. Pentru a citi datele, nu este nevoie să blocați datele. Oracle nu este MySQL. Citirea nu necesită eliberarea mesei, acesta a pus în aplicare multiversioning folosind segmente rollback.

De obicei, eroarea unei tabele mutante este rezolvată în două moduri:

  1. Declanșarea în tranziții autonome, dar corăcerii lui Oracles nu-l recomandă să o folosească.
  2. Și o cale mai sigură. Întârzierea prelucrării în declanșarea AFTER, așa cum a sugerat (14 Mar 14:09) andivanov. Salvați datele într-o matrice, apoi selectați-le.

Răspunsul este dat 24 Aug '11 la 15:46

Aș vrea să văd codul declanșatorului.

Am schițat un mic exemplu, cred că te va conduce.

răspuns dat la 3 februarie '11 la 11:26







Articole similare

Trimiteți-le prietenilor: