Delphi 2 MSSQL db szinkronizációja


 Sziasztok!
A kérdésem a következő lenne:
Van e olyan lehetőség, hogy AdoDataSet használatával az egyik adatbázisból kigyűjtöm egy dátum utáni változásokat (INSERT, UPDATE), és ezt átadom egy másik adatbázisra mutató AdoDataSet-nek, és egyszerűen UpdateBatch-el a változásokat belerakom a 2. adatbázisba? Ha van, akkor hogyan csináljam?
Ui.: Az egyszerűbb, de lassabb módszer már megvalósult, azaz, hogy kiválogatom a változásokat, és egyenként update-elem, vagy insert-álom, attól függően, hogy már létezik -e. Csak érdekelne, hogy van e más módszer.
A segítséget előre is köszönöm. |
1. (javasolt megoldás)
az MSSQL-nek van "beépített" replikációja, azaz olyan szolgáltatása, amivel 2 adatbázis tábláit szinkoronizálja. Ez nem jó neked?
2. (kézi, 2 db. utasítás az egész, célszerű egy tárolt eljárásban elhelyezni, és nem a kliensen bohóckodni)
két adatbázis közötti update és insert, ha van egy id (identity) mező a táblán, és egy mező, ami nyilvántartja az utolsó m,ódosítás időpontját
-- megváltozott rekordok UPDATE cél SET mező1 = forrás.mező1, mező2 = forrás.mező2, ... FROM db1.dbo.tábla forrás INNER JOIN db2.dbo.tábla cél ON forrás.id = cél.id WHERE cél.változásIdőpontja >= @adottIdőpont
-- új rekordok: SET IDENTITY_INSERT db2.dbo.tábla ON
INSERT INTO db2.dbo.tábla(id, mező1, mező2, ....) SELECT id, mező1, mező2, .... FROM db1.dbo.tábla WHERE id not in (SELECT if FROM db2.dbo.tábla)
SET IDENTITY_INSERT db2.dbo.tábla OFF
|
elírás: az első SQL-ben
WHERE cél.változásIdőpontja >= @adottIdőpont
helyett
WHERE forrás.változásIdőpontja >= @adottIdőpont
értendő |
Szia,
Nekem tetszene az első megoldás is, ha tud működni úgy két server között úgy, hogy azok között csak VPN kapcsolat van, és ennek a szinkronizációnak kb 2-5 percenként le kell futnia.
A második megoldással az a baj, hogy elég macerás táblánként dinamikusan összerakni a mezőneveket és az értékeket, és nem mellesleg az id nem autoincrementes, mivel global id-t és id tartományokat használok.
Ha az első megoldásban tudnál részletesebb segítséget nyújtani, azt megköszönném. Hol találom ennek a beállítási lehetőségét, és hogyan állítsam be?
Előre is köszi! |
Az ott olvasottakból az derül ki, hogy Express Edition alatt nincs replikáció. Mivel én azt használok, akkor ez a dolog nem fog működni. Jól gondolom?
valamint én csak visszatérnék az eredeti kérdésre, hogy Delphiben ezt hogyan tudom megoldani?
|
Az egyszerűbb, de lassabb módszer már megvalósult,
Döntsd el, mit szeretnél.
Csabi31 javaslata egyszerűbb és gyorsabb.
Delphi alatt bármit kreálsz e témában, az bonyolultabb és időigényesebb lesz (a hibalehetőségekről nem is beszélve). |
Csabi31 első javaslata nem működhet, mivel írtam, hogy express edition-t használok. A második javaslatára pedig már korábban leírtam, hogy szerintem nekem nem jó, mivel elég macerás lenne táblánként tárolt eljárást írni,és lényegében ugyanezt már megírtam kliens oldalon "lassabb módszer" címen.
Ezért kértem, hogy ha lehet, akkor az eredeti kérdésemre szeretnék választ kapni.
Természetesen örülök, hogy vannak, akik egyáltalán javaslatokat adnak, amit ezúton is köszönök, de sajnos véleményem szerint nem tudom a jelen problémámnál ezeket használni megoldásként, a fent leírtak miatt. |
| csak egy tárolt eljárást kell írnod. nincs más teendőd, csak annyi, hogy az INSERT és UPDATE triggerekben átadod a táblanevet, az egyedi azonosítót, és hogy INSERT vagy UPDATE történte-e. ezen információk birtokában össze tudsz állítani egy dinamikus sql uatsítást, majd exec-el futtatod. ha jól csinálod, akkor struktúra módosítás esetén sem kell többet módosítanod. csak annyi a teendőd, hogy ha létrehozol egy új táblát akkor a triggerekbe beleteszed a tárolt eljárást |
A második javaslatára pedig már korábban leírtam, hogy szerintem nekem nem jó, mivel elég macerás lenne táblánként tárolt eljárást írni,és lényegében ugyanezt már megírtam kliens oldalon "lassabb módszer" címen.
Bocsi, de ha egyszer már elbvetetted Csabi31 1. ötletét, akkor miért gondolod, hogy azt ajánlom?
Bármit kreálsz Delphi-ben, az csak lassabb lehet, mint egy server oldali adatbázis kezelő funkció.
Macerás ha még nem ismered, de érdemes megismerni, ha már ilyen témába vágtál..
Egyébként milyen távol van egymástól a két server? |
Egymástól távoli településeken vannak a serverek.
Lehet, hogy félreértettem, hogy azt is ajánlod, elnézést ezért!
Elfogadom, hogy jobb a server oldalon letudni ezeket, és hogy Delphi alatt ez lassabb és nehezebb, de mivel ezen a vonalon indultam el, és a határidő szorít, ezért szeretném a jelenlegi struktúrából kihozni, amit lehet. A későbbiekre nézve viszont valóban tanulságos dolgokat mondtatok.
De a kérdésem továbbra is az, hogy logikailag tud -e az működni, hogy két dataset két külön db-re mutat, az egyik datasetbe kigyűjtöm a változásokat az 1. db-ből, azt átrakom a másik datasetbe, és updatebatch-el beemelem a 2. db-be.
Kérlek, erre adj választ! Megigérem, hogy legközelebb tárolt eljárással oldom meg.  |
Köszönöm a segítséget!
Bár jelen problémámra nem kaptam megfelelő megoldást, de a jövőre nézve sok hasznos információt kaptam. |
|