10 messaggi dal 28 febbraio 2008
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?


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


SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:    <Author,,Ferdinando>
-- Create date: <Create Date,,>
-- Description:  <Description,,>
-- =============================================
CREATE TRIGGER dbo.Inserisci_Entrata_Futura 
   ON  dbo.Entrata 
   AFTER INSERT
AS 
BEGIN
  -- SET NOCOUNT ON added to prevent extra result sets from
  -- interfering with SELECT statements.
  SET NOCOUNT ON;

    -- 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.

Grazie
1.976 messaggi dal 27 luglio 2005
Contributi
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

Andrea Montanari
http://www.hotelsole.com - http://www.hotelsole.com/asql/index.php

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.