La cosa è un pò più complessa di quello che sembra. Per iniziare prova a scaricare Slide e Demo riguardo alle problematiche temporali che trovi qui:
http://community.ugiss.org/files/folders/workshop_20071003/default.aspx
Nel tuo trigger vai ad assegnare ad una variable il valore proveniente dalla tabella edizioni, ma in nessun modo ti garantisci il fatto che da quella tabella venga preso il valore ultimo inserito prima di quello attuale, quindi in pratica SQL Server te ne rida uno a caso. Una soluzione di esempio è questa:
alter trigger dbo.tg__edizione_iu
on dbo.edizione
after insert, update
as
set nocount on
if exists(
select
*
from
inserted i inner join dbo.edizione e on
i.corso = e.corso and
e.id_edizione <> i.id_edizione and
i.data_inizio < e.data_fine
) begin
rollback transaction
end
go
In pratica si inverte la logica e si verifica che non ci sia alcun corso a cui data di fine è minore della date di inizio del corso che si sta inserendo.
E' anche importante andare in JOIN con la tabella edizione evitando di prendere la riga che ha scatenato l'esecuzione del trigger, altrimenti un questa logica conterebbe anche se stessa andando quindi a dare sempre un risposta positiva (ossia che è vero che ci sono delle edizioni già in corso in quella data) e quindi annullerebbe la transazione.
Io ho fatto solo un piccolo esempio, verifica che funzioni tutto anche nel caso di UPDATE e di operazioni su più righe (ad es: cosa succede se fai INSERT INTO ... SELECT per rimpire la tabella edizioni? il trigger è in grado di gestire correttamente più di una riga?)
Per queste cose slide e demo consigliate in precedenza di saranno di GRANDE aiuto :-)