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