none
Sincronizzare solo 2 record tra 2 tabelle RRS feed

  • Domanda

  • Ciao,

    ho 2 database (DBX, DBY) identici tra i quali devo sincronizzare 2 tabelle (TABX, TABY) identiche, di queste 2 tabelle solo 2 record devono essere sincronizzati (identificati dal campo chiave).

    Naturalmente la modifica apportata sulla TABX deve essere replicata sulla TABY e viceversa.

    Ho provato con 2 trigger stardand, attivati sulle 2 tabelle, i trigger replica da TABX -> TABY l'altro il contrario, ma quando dall'applicazione viene aggiornato il record SQL Server genera questa eccezione:

    "è stato superato il numero massimo di livelli di nidificazione consentito etc etc".

    Il problema può essere riassunto in questa maniera: 2 database con schema identico devono condividere la tabella numerazioni, ma solo per il codice numerazione "PROVA"; ogni incremento della numerazione "PROVA" su uno dei 2 database deve essere replicato sull'altro.

    Il mio trigger è questo

    CREATE TRIGGER [dbo].[Numerazioni_SincNumerazioni]
       ON  [dbo].[Numerazioni]
       AFTER UPDATE
    AS 
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
    
        UPDATE DBX.dbo.Numerazioni SET DBX.dbo.Numerazioni.Prog = inserted.Prog
        FROM inserted
        WHERE DBX.dbo.Numerazioni.Codice = 'PROVA'
    		AND DBX.dbo.Numerazioni.Numer_Prog <> inserted.Numer_Prog
    
    END

    Avete qualche idea di come poter effettuare l'operazione senza metter mano all'applicazione?

    Grazie,

    a.


    • Modificato adimasi martedì 24 giugno 2014 08:49
    lunedì 23 giugno 2014 16:57

Risposte

  • Ciao, se hai questo errore è perchè l'istruzione

    SELECT inserted.Numer_UpdateTrigger from inserted

    restituisce più di un record.

    Stai facendo update massivi?

    Il trigger dovrebbe lavorare su singolo record e non su update di massa. 

    Daniele


    • Contrassegnato come risposta adimasi martedì 24 giugno 2014 11:21
    martedì 24 giugno 2014 10:29

Tutte le risposte

  • Ciao,

    è proprio perche hai due trigger che si scatena quell'errore. Di fatto quando aggiorni la tabella X scatta il trigger che aggiorna la Y. Aggiornata la Y scatta il trigger che aggiorna la X, aggiornata la X scatta nuovamente il trigger che aggiorna la Y, e cosi via all'infinito finche non raggiungi il numero massimo previsto per SQL Server (mi pare 32).

    Per risolvere la cosa potresti verificare se la tabella di destinazione non è già aggiornata. In tal caso non fai scattare l'update.

    Daniele

    martedì 24 giugno 2014 07:13
  • Ciao,

    è proprio perche hai due trigger che si scatena quell'errore. Di fatto quando aggiorni la tabella X scatta il trigger che aggiorna la Y. Aggiornata la Y scatta il trigger che aggiorna la X, aggiornata la X scatta nuovamente il trigger che aggiorna la Y, e cosi via all'infinito finche non raggiungi il numero massimo previsto per SQL Server (mi pare 32).

    Per risolvere la cosa potresti verificare se la tabella di destinazione non è già aggiornata. In tal caso non fai scattare l'update.

    Daniele

    Ciao Daniele,

    avevo già provato a inserire un controllo nella WHERE con lo statement  "DBX.dbo.Numerazioni.Numer_Prog <> inserted.Numer_Prog" proprio per evitare di innescare un loop, ma non ha funzionato.

    Adesso ho provato ad aggiungere un capo all'interno della tabella che ho chiamato "UpdateTrigger" di tipo bool che viene messo a true solo se il record è stato aggiornato tramite Trigger. Ho aggiunto prima del comando di UPDATE questi statement:

    if (SELECT inserted.Numer_UpdateTrigger from inserted) = 1
    BEGIN RETURN
    END

    Adesso però viene generato questo errore:

    La sottoquery ha restituito più di un valore. Ciò non è consentito per le sottoquery che contengono i caratteri =, != etc etc

    Pensavo fosse una buona idea, ma adesso sono un po' confuso :)

    Ciao,

    a.d.

    martedì 24 giugno 2014 08:56
  • Ciao, se hai questo errore è perchè l'istruzione

    SELECT inserted.Numer_UpdateTrigger from inserted

    restituisce più di un record.

    Stai facendo update massivi?

    Il trigger dovrebbe lavorare su singolo record e non su update di massa. 

    Daniele


    • Contrassegnato come risposta adimasi martedì 24 giugno 2014 11:21
    martedì 24 giugno 2014 10:29
  • Ciao,

    hai ragione, ho dimenticato di inserire una clausola nella WHERE:

    DX.dbo.Numerazioni.Codice = inserted.Codice

    Senza questa tentava di fare UPDATE su tutti i record.

    Grazie!!!!!!!!

    Ciao,

    a.d.

    martedì 24 giugno 2014 11:23