>Per vedere se il mio problema è risolto ho provato dopo aver
>creato le tabelle la view e i trigger ad eseguire la seguente
>query:
>
>INSERT dbo.VIEWSOSTANZAASSOCIAZIONI(IDAREA, IDMANSIONE, IDATTIVITA,
>IDSOSTANZA)
>VALUES (1, 2, 3, 4); SELECT SCOPE_IDENTITY();
>
>Il problema rimane ovvero la query ritorna NULL e non l'id assegnato
>nella tabella ASSOCIAZIONI_ENTITA, ovvero IDASSOCIAZIONIENTITA.
>Essendo il primo record doveva ritornare 1 , invece ritorna NULL.
>C'è qualcosa forse che sto sbagliando io?
I Books Online recitano: "SCOPE_IDENTITY() returns the last identity value inserted into an identity column in the same scope. A scope is a module: a stored procedure, trigger, function, or batch. Therefore, two statements are in the same scope if they are in the same stored procedure, function, or batch".
Nel tuo esempio l'INSERT in ASSOCIAZIONI_ENTITA avviene nel contesto del trigger, quindi in uno "scope" differente rispetto a quello che esegue la SELECT SCOPE_IDENTITY().
>Oppure effettivamente
>lo scope è differente e quindi SCOPE_IDENTITY() è corretto ritorni
>NULL.
Esatto
>E se questo è vero come posso fare per fargli ritornare
>il corretto ID?
Per ottenere l'ultimo valore IDENTITY generato nel trigger (che in questo caso corrisponde proprio a quello di ASSOCIAZIONI_ENTITA) devi ricorrere ad una funzione "insensibile al contesto" come @IDENTITY il cui "scope" è a livello di sessione:
SELECT SCOPE_IDENTITY() AS ID1, @@IDENTITY AS ID2;
/* Output:
ID1 ID2
----- ----
NULL 1
(1 row(s) affected)
*/
>P.s.: grazie per il trigger id DDL, ora ho anche un po' di cose
>da studiare.
E' un trigger DML, i DDL triggers vengono scatenati appunto da operazioni DDL (CREATE, ALTER, DROP,...)
Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org