giovedì 12 maggio 2016

TUTORIAL SQL SERVER - PARTE IV


Dopo la pausa del 2016, riprende il Tutorial di SQL Server [link]. Oggi iniziamo a vedere gli elementi di programmazione, nello specifico i Trigger analizzando pregi e difetti di questa funzionalità.



Nota: La versione presa in considerazione in questa guida è Microsoft SQL Server 2012.


Elementi di Programmazione

Come visto nell'articolo precedente [link], nel menu ad albero sulla sinistra di Microsoft SQL Server Management Studio sono presenti gli elementi di programmazione di un database. Gli elementi più importanti sono:
  • Trigger
    • Codice TSQL eseguito in coincidenza (prima o dopo) ad una operazione specifica effettuata su una tabella. 
  • Procedure
    • Codice TSQL eseguito a comando, può ricevere dei parametri di ingresso e può predisporre un output.
  • Funzioni
    • Codice TSQL eseguito a comando, utilizzato prevalentemente per costruire elaborazioni all'interno di una query (formattazione del testo, traduzione, funzioni matematiche...)
Di default sono presenti molti elementi di programmazione in un database, il programmatore può decidere di inserirne di nuovi.

Vi ricordo che questo è un tutorial sull'utilizzo di SQL Server e non sul linguaggio TSQL in ogni suo aspetto. Per una guida completa al linguaggio TSQL vi consiglio di dare un'occhiata alla guida W3Cschool SQL [link] o alla guida ufficiale Microsoft [link] (consiglio la guida W3C leggermente più alla portata dei principianti).

Trigger

Iniziamo scrivendo il nostro primo Trigger, per fare degli esempi continueremo a fare riferimento alle tabelle FILES, FOLDERS e FOLDERS_FILES visti nel precedente articolo [link].

Come detto, un Trigger è un codice TSQL eseguito in coincidenza ad una operazione specifica effettuata su una tabella, in particolare:
  • Prima che venga eseguita (parola chiave AFTER o FOR)
  • Dopo che è stata eseguito (parola chiave INSTEAD OF)
Le operazioni che vengono intercettate possono essere:
  • Inserimento di una nuova riga (parola chiave INSERT)
  • Modifica di una o più righe (parola chiave UPDATE)
  • Cancellazione di una o più righe (parola chiave DELETE)

Per creare un nuovo Trigger è necessario espandere gli elementi all'interno di una Tabella in SQL Server Management Studio, quindi selezionare la voce "New Trigger" dal menu contestuale della voce Trigger:

Se proviamo a creare un nuovo Trigger ci accorgiamo immediatamente che non esiste un editor guidato (come il Criteria Pane); I Trigger possono essere creati solo utilizzando direttamente codice TSQL.

Supponiamo di voler impedire al sistema di inserire un file con il nome "MALWARE", dovremo realizzare un Trigger Instead Of Insert per intercettare l'inserimento.

Il codice necessario per realizzare questa funzionalità sarà il seguente:
CREATE TRIGGER TBI_FILES
ON FILES
INSTEAD OF INSERT
AS
BEGIN
 DECLARE @FILE_NAME AS NVARCHAR(10)
 
 SELECT @FILE_NAME = (SELECT FILE_NAME FROM INSERTED)
 
 IF NOT @FILE_NAME LIKE '%MALWARE%'
 BEGIN
  INSERT INTO FILES 
  SELECT FILE_NAME,FILE_INFO,FILE_SIZE,FILE_ISLOCKED
  FROM INSERTED
 END

END

Leggere questo Trigger è molto semplice: dichiaro una variabile di appoggio in cui mettere il FILE_NAME del record inserito (INSERTED), se il nome non contiene la parola MALWARE allora lo inserisco.


Best Practice

Di norma per i Trigger viene adottata la nomenclatura Oracle (nel linguaggio PLSQL di Oracle non esiste la parola chiave INSTEAD OF ma la parola chiave BEFORE). I Trigger di solito vengono chiamati con il nome della tabella aggiungendo il prefisso che indica la modalità, vediamo tutte le combinazioni:
T + (B/A) + (I/U/D)

Cosa Quando Perchè Trigger
Trigger After (Dopo) Insert TAI_
Update TAU_
Delete TAD_
Before (Prima) Insert TBI_
Update TBU_
Delete TBD_

Infatti nel nostro caso il Trigger di intercettazione si chiama TBI_FILES.



Trigger, ATTENZIONE!

Quando si crea un Trigger Instead Of Insert dobbiamo prestare la massima attenzione nella scrittura del codice.


SE UN TRIGGER INSTEAD OF INSERT VA IN ERRORE NON VIENE INSERITO ALCUN RECORD NELLA TABELLA

Necessario sapere anche che se un Trigger contiene al suo interno una o più Query "pesanti", l'esecuzione di tali Trigger appesantirà enormemente le prestazioni di un Server SQL.

Trigger WITH APPEND (SQL 2008,SQL 2008 R2)

Se nella vostra esperienza trovate un Trigger che riporta la parola chiave WITH APPEND sappiate che la versione di riferimento è SQL Server 2008 oppure SQL Server 2008 R2, uniche due versioni che supportano questa parola chiave. Il significato di questa parola indica al motore del database di concatenare il trigger appena creato con quelli presenti sulla tabella.


Trigger NOT FOR REPLICATION (SQL 2008+)

La parola chiave NOT FOR REPLICATION, applicabile dalla versione 2008 di SQL Server, indica al Servizio di Replica di ignorare l'esecuzione di questo trigger durante l'operazione di replica.

Il Servizio di Replica è un servizio concorrente al motore del database che si occupa di mantenere la base dati consistente [wikipedia] replicando le operazioni transazionali di un database su quello di replica.

Verso la Parte V

Nel prossimo articolo [link] vedremo un altro elemento di programmazione di SQL Server, le Procedure o Stored Procedure.

Nessun commento:

Posta un commento