Frage : Wie man die Daten einer Geschichtentabelle übereinstimmte ohne Abstände beibehält?

Hallo, müssen

I eine Geschichtentabelle beibehalten, wo gegeben eine neue Eintragung, oder eine Aufzeichnung ist modernisiert, wird die Tabelle neu erstellt oder ausgerichtet (nur für Aufzeichnungen mit der gleichen Identifikation). Es sollte keine Abstände zwischen den Aufzeichnungen geben. Jede Aufzeichnung hat ein StartDate und ein EndDate. Unter ist das Schema der Tabelle:

CREATE TABELLE [dbo]. [Geschichte] (
[HistoryID] bigint IDENTITÄT (1, 1) NICHT NULL,
[Identifikation] int NICHT UNGÜLTIG,
[StartDate] Datum/Uhrzeit NICHT UNGÜLTIG,
[EndDate] Datum/Uhrzeit-NULL,
[Status] tinyint NULL,
PRIMÄRSCHLÜSSEL DER BEGRENZUNGS-[History_pk] GESAMMELT ([HistoryID]),
BEGRENZUNG [History_uq] ist EINZIGARTIGES ([Identifikation], [StartDate])
)
ON [PRIMÄR]
GO

Here Beispieldaten mit den ausgerichteten Daten:

The DateFormat ist dd/mm/yyyy

HistoryID Identifikation StartDate EndDate Status
1 1 01/01/2010 10/01/2010 1
2 1 11/01/2010 15/01/2010 2
3 1 16/01/2010 20/01/2010 3

Rules:
1.Get gereinigt von irgendwelchen Reihen, die völlig innerhalb des Bereiches der neuen Reihe sind, die eingesetzt werden oder updated.
example:

INSERT IN Geschichte (Identifikation, StartDate, EndDate, Status)
VALUES (1, „01/01/2010“, „17/01/2010“, 2)

The Ende ResultSet sollte sein, wie folgt:

HistoryID Identifikation StartDate EndDate Status
6 1 01/01/2010 17/01/2010 2
3 1 18/01/2010 20/01/2010 3

Note, dass die Aufzeichnung mit HistoryID=3 das StartDate haben, nahm um 1 wegen des EndDate vom vorhergehenden Rekord zu (6) sind grösser, als das StartDate der Aufzeichnung unter (3), das Strecke von 16/01/2010 zu 20/01/2010.

The das gleiche Verhalten war, sollte zutreffen, wenn der Benutzer ein Update auf irgendeiner Aufzeichnung auf irgendeinem Feld (StartDate, EndDate, Status) .

Following das vorhergehende resultset bildet, lässt EINSATZ mehr Daten in die table.

HistoryID Identifikation StartDate EndDate Status
6 1 01/01/2010 17/01/2010 2
3 1 18/01/2010 20/01/2010 3

INSERT IN Geschichte (Identifikation, StartDate, EndDate, Status)
VALUES (1, „05/01/2010“, „10/01/2010“, 1)

ResultSet nach dem Einsatz:

HistoryID Identifikation StartDate EndDate Status
6 1 01/01/2010 04/01/2010 2
7 1 05/01/2010 10/01/2010 1
8 1 11/01/2010 17/01/2010 2
3 1 18/01/2010 20/01/2010 3

Now der Benutzer ändert die Aufzeichnung mit HistoryID=3, mit dem folowing UPDATE:
UPDATE
GESETZTES StartDate='17/01/2010', EndDate='19/01/2010', Status=1
WHERE HistoryID=3

Resultset:

HistoryID Identifikation StartDate EndDate Status
6 1 01/01/2010 04/01/2010 2
7 1 05/01/2010 10/01/2010 1
8 1 11/01/2010 16/01/2010 2
3 1 17/01/2010 19/01/2010 1
9 1 20/01/2010 20/01/2010 3


Another EINSATZ:

INSERT IN Geschichte (Identifikation, StartDate, EndDate, Status)
VALUES (1, „01/01/2010“, „18/01/2010“, 1)

Resultset:

HistoryID Identifikation StartDate EndDate Status
10 1 01/01/2010 19/01/2010 1
9 1 20/01/2010 20/01/2010 3

Note, dass die Aufzeichnungen 7.8.3 gelöscht wurden. Die neue addierte Aufzeichnung nimmt das EndDate, das bis 19/01/2010 wegen des EndDate von Aufzeichnungs-NO3 geändert wird, hatte den gleichen Status, diesen Mittel, dass es keine Notwendigkeit gibt zu halten, oder, das Aufzeichnungs-NO3 zu ändern irgendein, das EndDate von ihm gerade zu nehmen und es auf das eben eingesetzte record.

I zu setzen nicht dieses Resultat zusammen mit dem Verhalten erzielen können, das hier herausgestellt wird. Ich weiß nicht wenn sein besseres, es als Auslöser zu tun oder ein Verfahren für die Einfügung der Aufzeichnungen und die ganze Arbeit zu erledigen in it.

That´s zu schreiben es. Wenn es gibt, jeder möglicher Zweifel über die Richtlinien mich bitte lassen know.

Thanks!

Best Respekt,

Marco André

Antwort : Wie man die Daten einer Geschichtentabelle übereinstimmte ohne Abstände beibehält?

hallo Marco,

Die große Anzahl der Aufzeichnungen kann Leistungsprobleme in beiden Drehbüchern vorstellen. Das grundlegende Problem über Leistung ist immer das selbe: Alle Drehbücher prüfen und die Resultate vergleichen.

Ihre korrekte Geschichtenaufzeichnung zu finden ist einfach:

OBERSEITE 1 * VON VORWÄHLEN [HistoryTable] WO [Datum] <>
Sie können eine verbraucherbestimmte Tabellewert Funktion verwenden, um diese Aufzeichnung zu berechnen, aber ich kann nicht über seine Leistung schätzen. Möglicherweise gibt es verbinden ein kühles, aber ich kann ein nicht im Augenblick mich vorstellen;)

Der mehrfache Benutzer, den Probleme die selben in beiden Lösungen, es sind, ist das gleiche Problem über Atomizität wie im weithin bekannten Bankkontoübergangsproblem. Sie benötigen eine ausdrückliche Verhandlungsteuerung, die Ihre Logik einkapselt und ein Lokalisierungsniveau von gelesen legen fest oder verbessern.

mfG
--> Stefan <-->
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
VORWÄHLEN  *
VON    [EventTable] E
        KREUZ TREFFEN zu [dbo]. [FindHistory] (E. [Identifikation], E. [EventDate]) H;

-- mit

FUNKTION [FindHistory] VERURSACHEN
    (
      @ID ALS INT,
      @EVENTDATE ALS DATUM/UHRZEIT
    )
RÜCKKEHR-TABELLE
WIE
RÜCKKEHR
    (AUSERWÄHLTE OBERSEITE 1
                H.*
      VON      [HistoryTable] H
      WO     H.ID = @ID
                UND H. [HistoryDate] = @EventDate
      AUFTRAG DURCH  H. [HistoryDate] DESC
    )
Weitere Lösungen  
 
programming4us programming4us