salve,
Eracle wrote:
Ho creato un trigger associato ad una tabella Entrata, dal nodo trigger crea nuovo
poi ho eseguito il blocco di istruzioni per la sua creazione ed è andata a buon fine.
Pero' poi nel nodo trigger non appare quello che ho creato(che è anche l'unico , quindi nn ce ne sono).
Come mai non è presente nel nodo trigger di Entrata il trigger appena creato?
dopo la creazione del trigger, questo non risulta "visibile" in SQL Server Management Studio (Express) fino a che non "aggiorni" la visualizzazione... devi quindi effettuare un chiamata al refresh: tasto dx, [refresh]
Ho la tabella entrata(EntrataID,importo,data) e una tabella entrataFutura(EntrataFuturaID)
con un fk da entratafutura(entratafuturaID) a entrata(EntrataID)
quidi se dovessi inserire in Entrata una un'stanza con una data maggiore di quella attuale la deve scrivere prima in entrata e poi in entrataFutura e ho scritto i lseguente trigger
Insert statements for trigger here
Declare @dataEntrata smalldatetime;
Declare @idEntrata INT;
Select @dataEntrata= Entrata.Data from Entrata;
Select @idEntrata = Entrata.EntrataID from Entrata;
if @dataEntrata > GETDATE()
insert into dbo.Entrata_Futura
(EntrataFuturaID)
values
(@idEntrata)
END
GO
Sintaticamente il trigger va bene , nn so se funziona poichè nn so se è attivo? se devo attivarlo? e prechè nn è presente nel nodo trigger della tabella Entrata a cui è associato come ho scritto sopra.
e' attivo appena creato.. ma sintatticamente non e' corretto.. dovresti operare sulle tabelle virtuali INSERTED/DELETED per avere accesso alle sole righe modificate..
tendenzialmente dovresti operare quindi come
SELECT @dataEntrata= i.Data, @idEntrata = i.EntrataID
FROM inserted i;
e non gia'
Select @dataEntrata= Entrata.Data from Entrata;
Select @idEntrata = Entrata.EntrataID from Entrata;
il trigger ha poi un problema circostanziale non indifferente, in quanto cosi' come fatto, puo' solamente operare nel caso di inserimento di 1 sola riga alla volta... quindi fallisce se tu eseguissi
INSERT INTO dbo.Entrate SELECT col1, coln FROM dbo.AltraTabella; ad esempio dipendente da un simil caricamento bulk da altra tabella... andrebbe quindi modificato, indicativamente, in
IF @@ROCOUNT = 0
RETURN;
in caso di nessuna pendenza, esce
IF EXISTS(SELECT 1 FROM inserted WHERE i.Data > GETDATE()) BEGIN
esegue il carico in dbo.Entrata_Futura
INSERT INTO dbo.Entrata_Futura (EntrataFuturaID)
SELECT i.EntrataID
non manca anche la data di entrata?? FROM inserted i
WHERE i.Data > GETDATE();
END;
e' necessario prestare molta attenzione nella codifica dei trigger in modo che questi siano validi per qualsiasi numero di righe siano presenti nelle tabelle virtuali INSERTED/DELETED, che sono in definitiva le righe processate in "gruppo"... se la cosa non fosse possibile e si renda necessario un'esecuzione monoriga, questa va indicata ed il trigger bloccato in caso di esecuzione multiriga, similarmente a
IF @@ROCOUNT = 0
RETURN;
in caso di nessuna pendenza, esce
IF @@ROCOUNT > 1 BEGIN
RAISERROR ( 'Una sola riga alla volta!', 16, 1 );
RETURN;
esce
END;
saluti