2012-02-23 13 views
6

Come vengono implementati i trigger all'interno di un motore di database SQL? Non mi riferisco alle definizioni di trigger a livello di linguaggio SQL, ma piuttosto alle loro implementazioni sottostanti in Oracle, SQL Server, MySQL, ecc. In che modo il motore di database può gestire in modo scalabile centinaia o migliaia di trigger? Usano un modello di sottoscrizione di pubblicazione come con un modello di osservatore/ascoltatore? Sarebbero anche apprezzati eventuali riferimenti alla letteratura pertinente sull'argomento.Come vengono implementati i trigger di database all'interno di un motore di database SQL?

Ho fatto google per "l'implementazione del trigger del database" ma tutto ciò che ho trovato erano informazioni sulle definizioni di trigger SQL, che ancora non voglio che io stia cercando.

+0

Penso che questo dovrebbe probabilmente essere su [dba.se] ..; ma lo terrò d'occhio perché in realtà non lo so. – Ben

risposta

3

I trigger sono richiamate, quindi l'implementazione può essere semplice come puntatori di funzione in C. Normalmente, un utente non è in attesa di scrivere codice procedurale definito dall'utente nel RDBMS in C, però. Dovresti supportare qualche altra lingua "di livello superiore". Quindi il modello di programmazione rilevante è DSL. Il numero di trigger (scalabilità) di per sé non è un problema perché di solito c'è solo uno, massimo due per tabella e trigger di eventi DML solo questi. La sfida dell'implementazione è altrove: nelle aree di coerenza, semantica della concorrenza.

+0

Sto cercando di implementare un meccanismo simile a un trigger nel mio sistema. Sì, sono consapevole che "l'utente non è in attesa di scrivere [sic] codice procedurale definito dall'utente nel RDBMS". Non mi sto limitando a supporre che "di solito c'è solo uno, un massimo di due per tavolo". Sto guardando un caso di fascia alta in cui potrebbero esserci migliaia di trigger. – stackoverflowuser2010

+1

Esiste un numero estremamente limitato di eventi trigger: inserimento, aggiornamento, eliminazione: non riesco a pensare ad altro. In uno scenario di palla dispari, un innesco può chiamare migliaia di procedure - ma qui sono completamente fuori dal mondo fantasy e non capisco le tue esigenze. –

1

Prima di tutto, i trigger sono parti di codice che vengono eseguite quando un determinato evento (ad esempio INSERT/UPDATE/DELETE su una determinata tabella) si verifica nel database. I trigger vengono eseguiti implicitamente PRIMA o AFER dell'istruzione DML e i trigger non possono essere eseguiti esplicitamente come le stored procedure.

Esistono anche due tipi di trigger: trigger STATEMENT LEVEL e trigger ROW LEVEL.

I trigger STATEMENT LEVEL vengono attivati ​​PRIMA o DOPO che viene eseguita un'istruzione.

I trigger RIGA LIVELLO vengono attivati ​​PRIMA o DOPO che un'operazione viene eseguita su ogni singola riga interessata dall'operazione.

Così abbiamo 12 tipi di trigger:

1. BEFORE INSERT STATEMENT 
2. BEFORE INSERT ROW 
3. AFTER INSERT STATEMENT 
4. AFTER INSERT ROW 
5. BEFORE UPDATE STATEMENT 
6. BEFORE UPDATE ROW 
7. AFTER UPDATE STATEMENT 
8. AFTER UPDATE ROW 
9. BEFORE DELETE STATEMENT 
10. BEFORE DELETE ROW 
11. AFTER DELETE STATEMENT 
12. AFTER DELETE ROW 

più trigger possono essere codificati per un evento con il loro ordine di precedenza di esecuzione menzionato.

Ogni volta che si esegue una query DML (INSERT/UPDATE/DELETE) su un database, tale query viene eseguita in una transazione. Pertanto, quando una query viene eseguita -

  1. La tabella è bloccata
  2. I controlli DBMS per i trigger che vengono eseguiti prima che l'istruzione deve essere eseguito
  3. esegue l'istruzione SQL effettiva riga per riga.
  4. Si cerca il trigger BEFORE per EACH ROW. Se trovato, eseguito.
  5. Verificare la presenza di errori. Se presente, ripristina le modifiche apportate dall'istruzione o dai suoi trigger.
  6. Qualsiasi trigger AFTER EACH ROW viene trovato ed eseguito.
  7. Qualsiasi trigger AFTER STATEMENT viene trovato ed eseguito.

Diversi DBMS gestiscono le transazioni in modo diverso. Fare riferimento alla loro documentazione per i dettagli.

Molti DBMS mantengono i trigger solo in formato testo, non come stored procedure compilate.

È consigliabile richiamare procedure memorizzate all'interno di un corpo del trigger poiché le procedure memorizzate sono molto più veloci rispetto ai trigger.

Problemi correlati