Welcome to Sign in | Help

Re: Oglindire tabela pe servere diferite

  •  11-08-2007, 6:48 PM

    Re: Oglindire tabela pe servere diferite

    Presupun că pe server-ele linked1, linked2, etc, utilizatorii nu pot modifica/adăuga produse (pot să aleagă doar din cele existente atunci când fac facturi, etc), nu-i aşa?

    Pe de altă parte, mi s-ar părea mai normal ca server-ele secundare să aibă un linked server către server-ul principal (nu invers, cum ai propus tu). Dar dacă trebuie să fie invers (din motive de securitate), nu-i nicio problemă (se modifică în mod corespunzător numele tabelelor). Să luăm un exemplu. Pe server1, avem:


    CREATE
    TABLE Produse (
          ID_Produs int IDENTITY PRIMARY KEY,
          Denumire nvarchar(50) NOT NULL UNIQUE,
          UM varchar(5) NULL
    )

    INSERT INTO Produse (Denumire, UM) VALUES ('Mere', 'KG')
    INSERT INTO Produse (Denumire, UM) VALUES ('Pere', 'KG')
    INSERT INTO Produse (Denumire, UM) VALUES ('Capsator', 'BUC')

     

    Pe linked1, linked2, etc, avem:

    CREATE TABLE Produse (
          ID_Produs int PRIMARY KEY,
          Denumire nvarchar(50) NOT NULL UNIQUE,
         
    UM varchar(5) NULL,
          StocMinim numeric(15,3) NULL
    )

    Pentru început, să presupunem că avem toate datele din server1: 

    INSERT INTO Produse (ID_Produs, Denumire, UM)
    SELECT ID_Produs, Denumire, UM FROM server1.YourDB.dbo.Produse

    şi avem în plus ceva informaţii completate pe coloana StocMinim:

    UPDATE Produse SET StocMinim=10 WHERE Denumire='Mere'

    Atunci creăm urmatoarea procedură:

    CREATE PROCEDURE SincronizareProduse
    AS
    UPDATE
    Produse SET Denumire=n.Denumire, UM=n.UM
    FROM Produse v INNER JOIN server1.YourDB.dbo.Produse n ON v.ID_Produs=n.ID_Produs
    WHERE v.Denumire<>n.Denumire
          OR v.UM<>n.UM
          OR v.UM IS NULL AND n.UM IS NOT NULL
          OR v.UM IS NOT NULL AND n.UM IS NULL

    INSERT INTO Produse (ID_Produs, Denumire, UM)
    SELECT ID_Produs, Denumire, UM FROM
    server1.YourDB.dbo.Produse
    WHERE ID_Produs NOT IN (SELECT ID_Produs FROM Produse)

    Şi să zicem că între timp se întâmplă nişte modificări pe server1:

    UPDATE Produse SET Denumire='Mere ionatane' WHERE Denumire='Mere'

    INSERT INTO Produse (Denumire, UM) VALUES ('Mere golden', 'KG')

    Atunci când executăm:

    EXEC SincronizareProduse


    Ar trebui ca datele modificate să se transfere de pe server. Ce probleme pot apare:

    1. dacă în linked1 utilizatorii ar fi adăugat un alt produs, "Perforator", să zicem, care are ID-ul 4, atunci când apelăm procedura de sincronizare denumirea acestui produs s-ar modifica fiind acum "Mere ionatane" (şi dacă aveam o factură de vânzare pentru 3 buc Perforator, atunci aceasta devine 3 kg Mere ionatane)

    2. dacă în linked1 utilizatorii au adăugat un alt produs numit "Mere ionatane" (în afară de produsul numit "Mere"), atunci când apelăm procedura de sincronizare vom obţine eroare "Violation of unique key ...", pentru că se încearcă modificarea denumirii produsului "Mere" în "Mere ionatane",
    deşi există deja un alt produs cu acest nume.

    Dacă se stabileşte de la început regula că în celelalte servere utilizatorii nu modifică datele din tabela Produse, atunci aceste probleme sunt excluse. Dacă este nevoie ca utilizatorii să adauge sau să modifice date în tabela Produse şi pe celelate server-e, atunci s-ar putea face sincronizarea folosind în join coloana Denumire în loc de ID, dar şi aşa ar putea apare probleme (de exemplu dacă s-au folosit unităţi de măsură diferite).

    Răzvan

View Complete Thread
Powered by Community Server (Commercial Edition), by Telligent Systems