none
Trigger su Tabella replicata non sincronizzato con Sottoscrittore RRS feed

  • Domanda

  • Ciao,

    ho questa situazione:

    Database su SQL Server 2012, con replica transazionale continua verso SQL Server 2016.

    lo schema option delle tabelle replicate è 0x000000000DFF7FDF

    che dovrebbe comprendere anche la copia dei trigger utente.

    A regime, capita che la creazione di un trigger tabella non viene riportato sulla rispettiva tabella del sottoscrittore.

    Ho preso io un abbaglio o c'è qualcosa che non va?

    Giusto per, ho provato anche a cambiare lo schema option in 0x000003444DFF7FDF ma non cambia nulla.

    Grazie per chi vorrà darmi una mano a capire.

    martedì 6 ottobre 2020 15:33

Risposte

  • Ciao,

    l'opzione NOT FOR REPLICATION regola il comportamento (attivazione) del Trigger relativamente ai comandi di INSERT/UPDATE/DELETE eseguiti dagli agenti di replica. Quando l'opzione NOT FOR REPLICATION è impostata, il Trigger verrà attivato dai comandi DML eseguiti dagli utenti/applicazione, ma non da quelli eseguiti dagli agenti di replica nelle tabelle dei sottoscrittori.

    Per la replica, nei sottoscrittori, delle modifiche eseguite allo schema di una tabella pubblicata, dipende dall'opzione "Replicate schema changes" nel riquadro Susbcriptions della pubblicazione. By default l'opzione è TRUE, il che significa che le modifiche allo schema vengono replicate.

    Aggiungo i link a due video che spiegano le basi dei meccanismi di replica in SQL Server, risalgono a SQL Server 2008 ma i concetti sono ancora attuali, li trovate su Vimeo canale UGISS:

     

    Ciao!


    Sergio Govoni

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

    domenica 11 ottobre 2020 15:00
    Moderatore

Tutte le risposte

  • Ciao,

    una prima verifica consiste nel controllare il flag is_not_for_replication sulla vista di sistema sys.triggers: è acceso (=1) o spento (=0)?

    Inoltre come create il trigger? utilizzate il comando "create trigger" da finestra query di  SSMS oppure una interfaccia grafica differente?

    Potrebbe essere che la modalità di creazione del trigger utilizzata non si limiti alla semplice  "creare trigger" ma ricrei l'intera tabella con un travaso dei dati dalla vecchia alla nuova: in tal caso la replica non supporterebbe questa operazione.

    Ad ogni modo dovrebbe esserci traccia nel log della replica di un eventuale errore.

    Giorgio

    venerdì 9 ottobre 2020 05:30
  • Ciao,

    grazie per la tua disponibilità.

    La cosa strana è che is_not_for_replication è spento, quindi il trigger dovrebbe essere portato.

    il create trigger avviene da finestra query di ssms

    Create trigger dbo.nome_trigger on dbo.tabella
    for insert, update, delete
    as 
    begin 
    set nocount on
    select getdate()
    end

    la cosa strana è che una volta creato manualmente il trigger anche sul Subscriber un eventuale ALTER del trigger sul Publisher viene replicato anche sul Subscriber

    Nei log della replica non c'è traccia di alcun errore, già controllato anche questo aspetto.

    sabato 10 ottobre 2020 08:20
  • Ciao,

    l'opzione NOT FOR REPLICATION regola il comportamento (attivazione) del Trigger relativamente ai comandi di INSERT/UPDATE/DELETE eseguiti dagli agenti di replica. Quando l'opzione NOT FOR REPLICATION è impostata, il Trigger verrà attivato dai comandi DML eseguiti dagli utenti/applicazione, ma non da quelli eseguiti dagli agenti di replica nelle tabelle dei sottoscrittori.

    Per la replica, nei sottoscrittori, delle modifiche eseguite allo schema di una tabella pubblicata, dipende dall'opzione "Replicate schema changes" nel riquadro Susbcriptions della pubblicazione. By default l'opzione è TRUE, il che significa che le modifiche allo schema vengono replicate.

    Aggiungo i link a due video che spiegano le basi dei meccanismi di replica in SQL Server, risalgono a SQL Server 2008 ma i concetti sono ancora attuali, li trovate su Vimeo canale UGISS:

     

    Ciao!


    Sergio Govoni

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

    domenica 11 ottobre 2020 15:00
    Moderatore
  • Ciao,

    la replica dei triggers è regolata da un settaggio a livello di Articolo che per default è false:

    Ogni articolo può avere un suo proprio settaggio.

    Va ben compreso il significato del NOT FOR REPLICATION che, come detto da Sergio, non ha a che fare con la replica dell'oggetto trigger ma con l'esecuzione del trigger da parte degli agent di replica: il punto è che gli effetti del trigger potrebbero essere replicati due volte sul sottoscrittore: una volta dalla mera replica dei dati e la seconda dall'esecuzione del trigger lato sottoscrittore.

    G.



    lunedì 12 ottobre 2020 14:06