AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi FB: keine Datums-Zeitraum-Überlappung
Thema durchsuchen
Ansicht
Themen-Optionen

FB: keine Datums-Zeitraum-Überlappung

Ein Thema von hoika · begonnen am 3. Dez 2009 · letzter Beitrag vom 7. Dez 2009
Antwort Antwort
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#1

FB: keine Datums-Zeitraum-Überlappung

  Alt 3. Dez 2009, 21:16
Datenbank: FB • Version: 2 • Zugriff über: egal
Hallo #,

in einer Tabelle speichere ich Datensätze

Id Integer (PrimKey)
StartDate Date
EndDate Date

StartDate/EndDate definieren Zeiträume.
Ich möchte verhindern, dass überlappende Zeiträume gespeichert werden.

Erlaubt ist
1.1.2009-5.1.2009
6.1.2009-9.1.2009

Nicht erlaubt
1.1.2009-5.1.2009
5.1.2009-9.1.2009

oder
1.1.2009-5.1.2009
4.1.2009-9.1.2009


Bekomme ich das irgendwie in der DB hin,
Index geht wohl nicht
Check-Constraint ?

Mir wäre aber ein Constraint lieber.

Was kann ich hier machen ?

Danke


Heiko
Heiko
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: FB: keine Datums-Zeitraum-Überlappung

  Alt 3. Dez 2009, 22:21
SQL-Code:
CREATE TABLE tabelle (
  id INT,
  von DATE,
  bis DATE,
  CONSTRAINT PK_tabelle PRIMARY KEY (id),
  CONSTRAINT CK_tabelle CHECK (NOT EXISTS (SELECT *
                                           FROM tabelle
                                           WHERE new.von <= bis
                                             AND new.bis >= von))
);
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: FB: keine Datums-Zeitraum-Überlappung

  Alt 4. Dez 2009, 07:33
Das Select in CK_tabelle findet nur Datensätze, die in der aktiven Transaktion sichtbar sind.
Deshalb ist es im Ausnahmefall doch noch möglich überschneidende Zeiträume zu erfassen:
Code:
Transaction1.Start;
Transaction2.Start;

innerhalb von Transaktion1:
insert into tabelle
 (id, von, bis)
values
 (1, '01.01.2009', '31.12.2009');

Transaction1.Commit;

innerhalb von Transaktion2:
insert into tabelle
 (id, von, bis)
values
 (2, '01.01.2009', '31.12.2009');

Transaction2.Commit;
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: FB: keine Datums-Zeitraum-Überlappung

  Alt 4. Dez 2009, 07:38
Hallo,

*seufz*

siehe auch

1

Und wie sollte man das dann machen ?

Ich befürchte, "Ich sperre, also bin ich",
muss ich wieder benutzen.



Heiko
Heiko
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: FB: keine Datums-Zeitraum-Überlappung

  Alt 4. Dez 2009, 09:10
Eine Möglichkeit wäre, den Schreibzugriff nur einer Transaktion zu gestatten:
SQL-Code:
CREATE TABLE T_LOCK (
    LOCKEVENT VARCHAR(40) NOT NULL
);

ALTER TABLE T_LOCK ADD CONSTRAINT PK_LOCK PRIMARY KEY (LOCKEVENT);

SET TERM ^ ;

create procedure P_LOCK (
    LOCKEVENT varchar(40))
as
declare variable CNT integer;
begin
  /* Aktion für andere Transaktionen sperren */
  select count(lockevent) from t_lock where lockevent = :lockevent into cnt;

  if (cnt = 0) then
  begin
    insert into t_lock (lockevent) values (:lockevent);
  end
  else
  begin
    update t_lock set lockevent = :lockevent where lockevent = :lockevent;
  end
end^

CREATE TRIGGER R_TABELLE_BI FOR T_TABELLE
ACTIVE BEFORE INSERT POSITION 0
as
begin
  /* Zugriff auf Tabelle für andere Transaktionen sperren */
  execute procedure p_lock ('T_TABELLE');
end
^
SET TERM ; ^
Wenn erforderlich auch im "Before Update".
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: FB: keine Datums-Zeitraum-Überlappung

  Alt 4. Dez 2009, 09:36
Hallo,

verstanden habe ich das jetzt nicht so richtig

Aber:
Was passiert, wenn mal "was schiefgeht",
d.h. in der Lock-Table steht aus Versehen noch was drin.

Das kommt jetzt schon dem "Ich sperre, also bin ich" nahe.

Ich glaube FB 2.1 hat da mit GTT (global temp table)
sogar was drin, was den Eintrag nach Abschluss der Transaktion wieder löscht.

Danke


Heiko
Heiko
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: FB: keine Datums-Zeitraum-Überlappung

  Alt 4. Dez 2009, 12:31
In der Lock-Tabelle steht immer was drin, das heist es wird nichts gelöscht.
Das Dummy-Update kann für einen bestimmten Datensatz nur einmal gemacht werden (jeder Datensatz repräsentiert eine Tabelle oder ein anderes Objekt das geschützt werden soll). So lange die Transaktion noch läuft, kann innerhalb einer anderen Transaktion der selbe Datensatz in T_LOCK nicht verändert werden. Der Trigger feuert in der ersten Transaktion, die einen Datensatz einfügt. So lange diese Transaktion nicht beendet wurde, wird jeder weitere Versuch einen Datensatz einzufügen scheitern.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: FB: keine Datums-Zeitraum-Überlappung

  Alt 7. Dez 2009, 14:49
Hallo,

so langsam begreife ich.

OK.

Aber geht das nicht auch anders,
aud DDL-Ebene ?


Heiko
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz