none
Anomalia Trigger RRS feed

  • Domanda

  • Salve, oggi mi è capitata una cosa molto strana.......

    Il trigger in oggetto, senza apparente motivo, ha creato nella tabella di destinazione oltre 1 milione di record....

    Non ne capisco il motivo visto che dovrebbe accodare solo record che corrispondono ad alcune caratteristiche...

    In particolare.... se nella tabella testedocumenti vengon inseriti record allora il trigger accoda in una tabella di supporto...

    Vi pare che il trigger sottoriportato riporti errori grossolani che possono fami capire meglio l'errore?...

    USE [Sicura]
    GO
    /****** Object:  Trigger [dbo].[Biri_TIDU_TESTEDOCUMENTI]    Script Date: 24/01/2019 17:40:01 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO


    ALTER TRIGGER [dbo].[Biri_TIDU_TESTEDOCUMENTI] ON [dbo].[TESTEDOCUMENTI] FOR INSERT, UPDATE , DELETE AS
    BEGIN
        DECLARE
           @NUMROWS  INT,
       @PROGR INT,
           @ERRNO    INT,
           @ERRMSG   VARCHAR(255),
       @UTENTECORRENTE VARCHAR (12)
     
    SELECT @UTENTECORRENTE=CURRENT_USER
        SELECT  @NUMROWS = @@ROWCOUNT
    SELECT @PROGR= [PROGRESSIVO] from INSERTED

        IF @NUMROWS = 0
           RETURN
        IF EXISTS (SELECT [TIPODOC] FROM INSERTED WHERE [TIPODOC] in ('RFW','RFS','RFJ','RFI','RFX'))
    BEGIN
       
    If NOT EXISTS (SELECT <g class="gr_ gr_109 gr-alert gr_spell gr_inline_cards gr_run_anim ContextualSpelling ins-del multiReplace" data-gr-id="109" id="109">PROGRESSIVO</g> FROM BIRI_TESTEDOC_DOUBLE WHERE (PROGRESSIVO = @PROGR))

    BEGIN
    INSERT INTO BIRI_TESTEDOC_DOUBLE(PROGRESSIVO, ESERCIZIO, TIPODOC, NUMERODOC, NUMRIFDOC, UTENTEMODIFICA, DATAMODIFICA)
    SELECT  PROGRESSIVO, ESERCIZIO, TIPODOC, NUMERODOC, NUMRIFDOC, @UTENTECORRENTE, getdate() FROM   inserted T1
    END

        RETURN
     
    /*  ERRORS HANDLING  */
    ERROR:
        RAISERROR (@ERRMSG, 1, 1)
        ROLLBACK  TRANSACTION
    END
    END


    Marco

    giovedì 24 gennaio 2019 16:43

Risposte

  • Ciao Marco,

    ho dato un'occhiata al Trigger, ho visto che risponde anche al comando UPDATE.

    L'inserimento del milione di record potrebbe essere stato causato da un UPDATE massivo (magari senza clausola WHERE), eseguito sulla tabella [dbo].[TESTEDOCUMENTI].

    L'INSERT di SELECT sulla tabella [dbo].[BIRI_TESTEDOC_DOUBLE] accede senza WHERE alla tabella Inserted che nel caso di UPDATE è alimentata con i record "old" ovvero quelli contenenti i valori precedenti alla modifica.

    Se il Trigger deve lavorare solo nel caso di INSERT, ti consiglio di togliere l'attivazione sui comandi di UPDATE.

    In aggiunta, migliorerei queste parti..

    L'assegnazione della variabile @PROGR:

    SELECT @PROGR= [PROGRESSIVO] from INSERTED

    è corretta solo quando la tabella Inserted conterrà una sola riga, nel caso di INSERT o UPDATE in cui sono coinvolte più righe, @PROGR conterrà sempre il valore della colonna Progressivo sulla prima riga di Inserted (questa assegnazione non è pensata per lavorare multi-riga).

    La variabile @PROGR è successivamente utilizzata qui:

    If NOT EXISTS (SELECT <g class="gr_ gr_109 gr-alert gr_spell gr_inline_cards gr_run_anim ContextualSpelling ins-del multiReplace" data-gr-id="109" id="109">PROGRESSIVO</g> FROM BIRI_TESTEDOC_DOUBLE WHERE (PROGRESSIVO = @PROGR))

    dove filterà solo per il valore della prima riga.

    Il Trigger risponde anche ai comandi DELETE, ma non è citata la tabella Deleted.. se il Trigger deve lavorare solo nel caso di INSERT, ti consiglio di togliere l'attivazione sui comandi DELETE.

    Ciao


    Sergio Govoni

    Microsoft Data Platform MVP | MVP Profile | English Blog | Twitter | LinkedIn


    domenica 10 febbraio 2019 16:37
    Moderatore

Tutte le risposte

  • il trigger in questione è stato appena creato oppure esiste da tempo ed ha sempre funzionato salvo quest'ultima anomalia ?

    Edoardo Benussi
    Microsoft MVP - Cloud and Datacenter Management
    e[dot]benussi[at]outlook[dot]it

    venerdì 1 febbraio 2019 12:49
    Moderatore
  • é stato creato da tempo..... ed in linea di principio ha sempre funzionato.... questa volta non ho idea di cosa si asuccesso.... il database era in manutenzione..... forse è stato fatto qualche "alter tabel"... ma non credo sulle tabelle in questione... 

    L'istanza non è stata riavviata.... non so cosa possa esere successo...

    se potesse essere di aiuto com einformazione, l'utente che ha accodato i record bypassando la condizione che verifica quali record accodare è l'utente "dbo"...


    Marco

    lunedì 4 febbraio 2019 07:55
  • Ciao Marco,

    ho dato un'occhiata al Trigger, ho visto che risponde anche al comando UPDATE.

    L'inserimento del milione di record potrebbe essere stato causato da un UPDATE massivo (magari senza clausola WHERE), eseguito sulla tabella [dbo].[TESTEDOCUMENTI].

    L'INSERT di SELECT sulla tabella [dbo].[BIRI_TESTEDOC_DOUBLE] accede senza WHERE alla tabella Inserted che nel caso di UPDATE è alimentata con i record "old" ovvero quelli contenenti i valori precedenti alla modifica.

    Se il Trigger deve lavorare solo nel caso di INSERT, ti consiglio di togliere l'attivazione sui comandi di UPDATE.

    In aggiunta, migliorerei queste parti..

    L'assegnazione della variabile @PROGR:

    SELECT @PROGR= [PROGRESSIVO] from INSERTED

    è corretta solo quando la tabella Inserted conterrà una sola riga, nel caso di INSERT o UPDATE in cui sono coinvolte più righe, @PROGR conterrà sempre il valore della colonna Progressivo sulla prima riga di Inserted (questa assegnazione non è pensata per lavorare multi-riga).

    La variabile @PROGR è successivamente utilizzata qui:

    If NOT EXISTS (SELECT <g class="gr_ gr_109 gr-alert gr_spell gr_inline_cards gr_run_anim ContextualSpelling ins-del multiReplace" data-gr-id="109" id="109">PROGRESSIVO</g> FROM BIRI_TESTEDOC_DOUBLE WHERE (PROGRESSIVO = @PROGR))

    dove filterà solo per il valore della prima riga.

    Il Trigger risponde anche ai comandi DELETE, ma non è citata la tabella Deleted.. se il Trigger deve lavorare solo nel caso di INSERT, ti consiglio di togliere l'attivazione sui comandi DELETE.

    Ciao


    Sergio Govoni

    Microsoft Data Platform MVP | MVP Profile | English Blog | Twitter | LinkedIn


    domenica 10 febbraio 2019 16:37
    Moderatore
  • Ciao Marco,

    hai avuto l'occasione di verificare?

    Grazie, ciao


    Sergio Govoni

    Microsoft Data Platform MVP | MVP Profile | English Blog | Twitter | LinkedIn

    domenica 17 febbraio 2019 18:05
    Moderatore
  • Ciao Sergio, come mi hai sugerito ho modificato il trigger solo per la condizione di INSERT e ad oggi il problema non si è piu presentato.... 

    Speriamo di aver risolto....

    Grazie per la pazienza.)


    Marco

    martedì 19 marzo 2019 16:52
  • Ciao Sergio, come mi hai sugerito ho modificato il trigger solo per la condizione di INSERT e ad oggi il problema non si è piu presentato.... 

    Speriamo di aver risolto....

    Per me hai risolto! :)

    Grazie a te per il feedback, e se avrai modo di partecipare al SQL Start 2019 ad Ancona potremo approfondire a voce.

    Ciao!


    Sergio Govoni

    Microsoft Data Platform MVP | MVP Profile | English Blog | Twitter | LinkedIn

    martedì 19 marzo 2019 23:27
    Moderatore