Search

onze sponsors

microsoft_logo.gif


 

computrain_logo.JPG

Forum Login | Register
   Forum

 

Subject: DTS - Copy SQL server Objects Task
Prev Next
You are not authorized to post a reply.

Author Messages
A SUser is Offline

Posts:25

09-10-2007 13:57:34 Alert 

Met DTS maak ik een kopie van alle data die in een tabel staat naar een andere server, waar een kopie staat van de database (endus ook de tabel).
Nu had ik gehoopt dat door het aanvinken van append data bij Copy tabblad dat er alleen nieuwe rijen worden toegevoegd. Dit is in ieder geval wel de bedoeling. De brondatabase wordt namelijk om de 8 dagen leeg gemaakt en de Destination tabel moet dus alle data bewaren.

Replicatie is geen optie, omdat de brontabel geen primary key kolom heeft.

Alvast dank voor jullie hulp!

mvg!

André KammanUser is Offline
PASS Nederland

Posts:137


09-10-2007 14:42:32 Alert 
Zonder primary key op je brontabel is het synchroniseren van 2 tabellen met behulp van welke techniek dan ook een stevige uitdaging.

Wat let je om een uniek geindexeerd veld toe te voegen aan je tabel ? (Een unieke index mag dus ook, je hoeft zeker geen Primary Key Constraint te maken !)
Het betreffende veld kun je dan gebruiken om de 2 tabellen te synchroniseren.

Let op: Een veld toevoegen kan, ook al heeft het veld niets met je data te maken, een aantal problemen veroorzaken :
1. Insert queries die geen kolommenlijst bevatten zullen een foutmelding geven omdat het aantal kolommen dat je wilt inserten niet meer klopt.
2. Een voor je data niet relevant veld inzetten als Primary Key kan als je de default instellingen gebruikt een clustered index opleveren wat wellicht geen goed idee is. Het zou veel fragmentatie kunnen veroorzaken.
3. Leveranciers van 3rd party applicaties vinden het niet altijd leuk dat je wijzigingen aanbrengt aan hun datamodel. (Ik vind persoonlijk niet alle datamodellen van 3rd party leveranciers leuk :-( )

let er tevens op dat je het juiste type kiest voor het veld.
Een guid (uniqueidentifier) kan lastig zijn bij het indexeren (zie ook mijn opmerking over een slecht gekozen clustered index)
Een int kan te smal zijn als je veel records hebt, gebruik dan een bigint ("veel" is in dit geval miljarden, denk echter niet alleen aan nu maar aan de toekomst)
(Overigens gooi je de brondatabase om de 8 dagen "leeg" en hoeft dit geen probleem te zijn, denk er wel aan dat een identity veld alleen gereset wordt bij een truncate en niet bij een delete)
Een datetime kan nog steeds voor dubbele records zorgen, of als je een unieke index gebruikt, voor key violations. (mislukte inserts vanwege dubbele key's, dat gaat op als je 2 records binnen dezelfde periode van 3ms probeert te inserten)

Verder zijn er wellicht mogelijkheden waarbij je de structuur niet hoeft aan te passen maar je werkwijze.
Heb je bijvoorbeeld wel een datumveld (logdatum of zo) en je gegevens wijzigen niet dan kun je bijvoorbeeld elke dag de dag ervoor overzetten.

Je weet dan zeker dat je alles hebt want de dag die je overzet is al om, er wordt dus niets meer toegevoegd.
En je weet zeker dat je alleen nieuwe records overzet want je doet alleen de dagen die je nog niet eerder hebt gedaan.
(Je kunt wat logica inbouwen die logt welke datum je de vorige keer hebt gedaan. Als je dan weer gaan synchroniseren pak je die dag + 1 t/m gisteren of zoiets)
Hier zijn nog wel wat verfijningen / alternatieven op te verzinnen.

Mocht hier nog geen bruikbare oplossing tussen zitten, zou je dan iets kunnen uitwijden over je tabel, je hoeveelheid gegevens en je gewenste synchronisatie frequentie ?

Groeten,

André

A SUser is Offline

Posts:25

09-10-2007 15:00:06 Alert 
Beste Andre,

hartelijk dank voor je bericht. Het gaat inderdaad om een third party database en ben daarom een beetje huiverig om er een kolom aan toe te voegen. ook omdat ik geen testomgeving heb van de appicaties, dus als ik het doe moet het in productie en dan maar afwachten of gebruikers gaan bellen, is dus een beetje link om te doen.
Ik heb geen datum velden, maar wel een aantal velden van het type integer lngYear, lngMonth, lngDay.

Dus daar zou ik iets mee kunnen doen. Kan ik de "Copy SQL server Objects Task" nu zo veranderen dat hij naar deze velden kijkt? Ik zie alleen maar dat ik een source kan ingeven, destination en wat dingetjes bij Copy tabblad.

mvg, Anne





A SUser is Offline

Posts:25

09-10-2007 15:00:07 Alert 
Beste Andre,

hartelijk dank voor je bericht. Het gaat inderdaad om een third party database en ben daarom een beetje huiverig om er een kolom aan toe te voegen. ook omdat ik geen testomgeving heb van de appicaties, dus als ik het doe moet het in productie en dan maar afwachten of gebruikers gaan bellen, is dus een beetje link om te doen.
Ik heb geen datum velden, maar wel een aantal velden van het type integer lngYear, lngMonth, lngDay.

Dus daar zou ik iets mee kunnen doen. Kan ik de "Copy SQL server Objects Task" nu zo veranderen dat hij naar deze velden kijkt? Ik zie alleen maar dat ik een source kan ingeven, destination en wat dingetjes bij Copy tabblad.

mvg, Anne





André KammanUser is Offline
PASS Nederland

Posts:137


09-10-2007 15:40:19 Alert 
Anne,

Je zult daarvoor iets meer moeten DTS'en. De "Copy SQL Server Objects Task" kan dit niet voor je regelen.

Denk bijvoorbeeld aan :

* Haal met een "Execute SQL Task" uit je kopie database de laatstgebruikte transferdatum.
Tel hier 1 (dag) bij op en zorg dat je geen gegevens van vandaag overzet, want dan zou je incompleet kunnen zijn want vandaag is nog niet voorbij natuurlijk.
* Maak via de "export parameters" deze datum beschikbaar voor de rest van het package. (Datum type is niet altijd handig om mee te werken, ik gebruik binnen dts meestal string waarin ik de datum in ISO formaat zet)
* Gebruik een "Transform Data Task" om gegevens tussen een bron en doelconnectie over te zetten. Gebruik als bron een query die de lngYear, lngMonth en lngDay velden gebruikt om de juiste records te selecteren.
* Schrijf de zojuiste gebruikte datum in je kopie database.

Dit gaat een stuk verder dan het gebruiken van een "Copy SQL Server Objects Task", mocht je hier tegenop zien omdat je wellicht niet veel hebt gewerkt met DTS tot nu toe laat het dan rustig weten.
Ik zet met alle plezier een voorbeeld in elkaar. Op dit moment (overdag) kan ik dat echter niet want ik heb hier geen testomgeving met DTS.

Groeten,

André
A SUser is Offline

Posts:25

10-10-2007 10:48:14 Alert 
Hoi André,

Bedankt weer voor je bericht. Ik ben er even mee aan de slag gegaan. Ik heb een tabelletje aangemaakt waarin ik de kopieen kan wegschrijven. Kan ik ook meteen makkelijk zien in de database of de kopieen goed gaan.

stap 1) laatste datum ophalen uit gekopieerde database en 1 dag erbij op tellen lukt--> staan in 3 output parameters: Dag, Maand en Jaar
Nu weet ik alleen niet precies wat ik precies bij value invul bij Global Variabkles. Ik heb daar dus 3 parameters aangemaakt (en als ik OK click, dan staan er weliswaar 3 parameters, maar bij Output Global Variables staat er bij alledrie 'none'.

Ik ga even verder met andere tasks, maar misschien weet jij hoe ik mijn 3 parameters moet instellen als output parameters?

Groeten, Anne
A SUser is Offline

Posts:25

10-10-2007 11:02:56 Alert 
ahaa, heb het al...
You are not authorized to post a reply.
Forums > Forums > Business Intelligence > DTS - Copy SQL server Objects Task



ActiveForums 3.6
  
Copyright (c) 2012 PASS Nederland   Privacy Statement  Terms Of Use