none
Sql Merge Replication con trigger RRS feed

  • Domanda

  • Ciao a tutti

    Sto utilizzando la Sql Merge Replication e incontro dei problemi in tabelle che hanno dei miei trigger. In pratica quando faccio una insert sul Publischer di un record in una tabella che ha un mio trigger, che in caso di Insert, lui inserisce un record su un'altra tabella, quando la Merge gira, sul Subscriber il mio trigger viene chiamato più volte, eseguendo in modo errato più insert.

    Ora c'è il modo con l'istruzione "NOT FOR REPLICATION" di non farlo scattare, ma mi serve il trigger attivo anche sotto Merge.

    In più mi scatta anche un secondo trigger che è settato come Update; se ne deduce che non solo fa più insert, ma anche un'update..... Tale comportamento, l'ho verificato anche col SqlProfiler, dove vedo moltissime operazioni, invece di una semplice insert sulla tabella "principale" ed una seconda insert causata dal mio trigger.

    Posso usare la Merge con dei miei trigger o devo disabilitarli? Ci sono altre problematiche che posso incontrare con questo strumento?

    GRAZIE

    venerdì 14 settembre 2018 09:39

Risposte

  • Buongiorno Sergio e grazie molte per i due video che mi sono subito guardato.

    Di nulla :)

    La risposta è si, la tabella è tra gli Articoli della Merge. Dal video si dice che si possono usare comunque trigger propri, ma non si è soffermato molto. Se ho intuito bene la cosa, si dovrebbe inserire sui trigger sia del Publiscer che del Subscriber, l'istruzione "NOT FOR REPLICATION" per poi aggiungere (ad oggi da me non è così) quella tabella su cui scrivono, tra gli Articoli?

    Hai intuito bene, se il Trigger esegue "banalmente" un Insert, potresti non farlo attivare durante il processo di replica e aggiungere la tabella oggetto dell'Insert tra quelle pubblicate e replicate. Quando aggiungo tra gli Articoli pubblicati una tabella che ha Trigger, mi chiedo sempre cosa deve succedere nei sottoscrittori.. se i dati Inseriti dal Trigger non servono nel/nei sottoscrittori puoi anche decidere di non pubblicarli. Dipende da quali dati sono necessari nei sottoscrittori.

    Poi dal video si diceva che sulle colonne Foreign Key, andrebbero marcate anch'esse come "NOT FOR REPLICATION" o è possibile da qualche parte segnare i vari "gruppi" di tabelle in relazione tra quelle presenti negli Articoli della Merge: giusto? Dove si segnala la cosa? e come mai le FK andrebbero marcate not for replication?

    L'opzione NOT FOR REPLICATION consente di specificare quali oggetti (Trigger, FK, ecc..) devono essere trattati in modo diverso quando un "agente di replica" esegue un'operazione. Detto questo, nel caso delle FK, potresti voler specificare l'opzione NOT FOR REPLICATION perchè la tabella collegata non viene replicata.. dipende dallo schema.

    Supponi un'anagrafica articoli con una FK sulla tabella "Marche", se la tabella "Marche" non deve essere pubblicata, il vincolo dovrà essere NOT FOR REPLICATION, solo così l'agente di replica potrà inserire un articolo con il riferimento univoco ad una marca senza che il relativo record sia presente nella tabella "Marche".

    Per completezza aggiungo alcuni link utili:

    Ciao!


    Sergio Govoni

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

    domenica 16 settembre 2018 20:19
    Moderatore

Tutte le risposte

  • Ciao,

    la tabella sulla quale viene fatto l'Insert via Trigger è anch'essa replicata? In tal caso, Publischer e Subscriber si manderanno record a vicenda per effetto dei Trigger presenti e attivi su entrambi i lati.

    Ti segnalo questi due video (spiegano le basi dei diversi meccanismi di replica), spero possano essere utili:

    Ciao!


    Sergio Govoni

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

    venerdì 14 settembre 2018 18:36
    Moderatore
  • Buongiorno Sergio e grazie molte per i due video che mi sono subito guardato.

    La risposta è si, la tabella è tra gli Articoli della Merge. Dal video si dice che si possono usare comunque trigger propri, ma non si è soffermato molto. Se ho intuito bene la cosa, si dovrebbe inserire sui trigger sia del Publiscer che del Subscriber, l'istruzione "NOT FOR REPLICATION" per poi aggiungere (ad oggi da me non è così) quella tabella su cui scrivono, tra gli Articoli?

    Poi dal video si diceva che sulle colonne Foreign Key, andrebbero marcate anch'esse come "NOT FOR REPLICATION" o è possibile da qualche parte segnare i vari "gruppi" di tabelle in relazione tra quelle presenti negli Articoli della Merge: giusto? Dove si segnala la cosa? e come mai le FK andrebbero marcate not for replication?

    Grazie molte!

    sabato 15 settembre 2018 11:47
  • Buongiorno Sergio e grazie molte per i due video che mi sono subito guardato.

    Di nulla :)

    La risposta è si, la tabella è tra gli Articoli della Merge. Dal video si dice che si possono usare comunque trigger propri, ma non si è soffermato molto. Se ho intuito bene la cosa, si dovrebbe inserire sui trigger sia del Publiscer che del Subscriber, l'istruzione "NOT FOR REPLICATION" per poi aggiungere (ad oggi da me non è così) quella tabella su cui scrivono, tra gli Articoli?

    Hai intuito bene, se il Trigger esegue "banalmente" un Insert, potresti non farlo attivare durante il processo di replica e aggiungere la tabella oggetto dell'Insert tra quelle pubblicate e replicate. Quando aggiungo tra gli Articoli pubblicati una tabella che ha Trigger, mi chiedo sempre cosa deve succedere nei sottoscrittori.. se i dati Inseriti dal Trigger non servono nel/nei sottoscrittori puoi anche decidere di non pubblicarli. Dipende da quali dati sono necessari nei sottoscrittori.

    Poi dal video si diceva che sulle colonne Foreign Key, andrebbero marcate anch'esse come "NOT FOR REPLICATION" o è possibile da qualche parte segnare i vari "gruppi" di tabelle in relazione tra quelle presenti negli Articoli della Merge: giusto? Dove si segnala la cosa? e come mai le FK andrebbero marcate not for replication?

    L'opzione NOT FOR REPLICATION consente di specificare quali oggetti (Trigger, FK, ecc..) devono essere trattati in modo diverso quando un "agente di replica" esegue un'operazione. Detto questo, nel caso delle FK, potresti voler specificare l'opzione NOT FOR REPLICATION perchè la tabella collegata non viene replicata.. dipende dallo schema.

    Supponi un'anagrafica articoli con una FK sulla tabella "Marche", se la tabella "Marche" non deve essere pubblicata, il vincolo dovrà essere NOT FOR REPLICATION, solo così l'agente di replica potrà inserire un articolo con il riferimento univoco ad una marca senza che il relativo record sia presente nella tabella "Marche".

    Per completezza aggiungo alcuni link utili:

    Ciao!


    Sergio Govoni

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

    domenica 16 settembre 2018 20:19
    Moderatore