Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Firebird Subtabelle plötzlich komplett leer (https://www.delphipraxis.net/212920-firebird-subtabelle-ploetzlich-komplett-leer.html)

BlueStarHH 24. Apr 2023 13:26

Datenbank: Firebird • Version: 3.x • Zugriff über: IBDAC

Firebird Subtabelle plötzlich komplett leer
 
Hallo,

in einer Firebird Datenbank, die nur ich verwenden (lokal auf meinem PC) ist eine Subtabelle plötzlich komplett leer. In dem Log meiner Software ist kein "delete" SQL-Befehl seit dem Tag, an dem alle Datensätze verschwunden sind, aufgezeichnet. Wie kann so etwas entstehen? Ich kann mich nicht erinnern, dass ich auf diese Subtabelle jemals manuell SQL-Querys angewandt habe. Immer nur über die IBDAC-Komponenten einzelne Datensätze gelöscht oder hinzugefügt. Mit ATable.Insert und ATable.Delete. Fehlermeldungen gab es auch keine. Mit dem IBExpert nachgeschaut: Die Tabelle ist wirklich leer. Zum Glück hatte ich ein Backup.

Lemmy 24. Apr 2023 13:37

AW: Firebird Subtabelle plötzlich komplett leer
 
was sagt gfix zu der Datenbank? (gfix -v -full....)
Gibt es cascading Updates / Delets? Also wie sieht die Tabellenstruktur aus?

BlueStarHH 24. Apr 2023 13:58

AW: Firebird Subtabelle plötzlich komplett leer
 
Zitat:

Zitat von Lemmy (Beitrag 1521473)
was sagt gfix zu der Datenbank? (gfix -v -full....)

Teste ich nachher. Danke für den Tipp.

Zitat:

Zitat von Lemmy (Beitrag 1521473)
Gibt es cascading Updates / Delets?

Hauptdatensätze sind noch alle da. Gelöscht werden die nur in Ausnahmen. Dann auch nur einzelne. Das verknüpfte ID-Feld sollte sich nie ändern.

Zitat:

Zitat von Lemmy (Beitrag 1521473)
Also wie sieht die Tabellenstruktur aus?

Code:
CREATE GENERATOR GEN_VORGANGPOSSER_ID;

CREATE TABLE VORGANGPOSSER (
    ID           SMALLINT NOT NULL,
    VGPOSID      INTEGER NOT NULL,
    BEZEICHNUNG  VARCHAR(40),
    SERIENNUMMER VARCHAR(40)
);

ALTER TABLE VORGANGPOSSER ADD PRIMARY KEY (ID);
ALTER TABLE VORGANGPOSSER ADD CONSTRAINT FK_VORGANGPOSSER_VGPOSID FOREIGN KEY (VGPOSID) REFERENCES VORGANGPOS (ID) ON DELETE CASCADE ON UPDATE CASCADE;

CREATE OR ALTER TRIGGER VORGANGPOSSER_BI FOR VORGANGPOSSER
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gen_vorgangposser_id,1);
end

DeddyH 24. Apr 2023 14:00

AW: Firebird Subtabelle plötzlich komplett leer
 
Daran könnte es liegen:
Zitat:

Zitat von BlueStarHH (Beitrag 1521476)
ALTER TABLE VORGANGPOSSER ADD CONSTRAINT FK_VORGANGPOSSER_VGPOSID FOREIGN KEY (VGPOSID) REFERENCES VORGANGPOS (ID) ON DELETE CASCADE ON UPDATE CASCADE;


himitsu 24. Apr 2023 14:07

AW: Firebird Subtabelle plötzlich komplett leer
 
Joar, gibt ja nur ein paar Möglichkeiten

* jemand hat wirklich in der SubTabelle alles gelöscht
* wenn in der HauptTabelle gelöscht wird, dann entfernt das
Delphi-Quellcode:
ON DELETE CASCADE
auch das Jeweilige in der SubTabelle

* mit
Delphi-Quellcode:
ON DELETE SET NULL
blieben diese SubDatensäte erhalten, aber die Referenz wird NULL
* bei
Delphi-Quellcode:
ON DELETE NO ACTION
... heißt "nothing is done" dass die SubDatensätze unverändert da bleiben, oder wird der Hauptdatensatz dann nicht gelöscht?
* und ohne
Delphi-Quellcode:
ON DELETE
sollte das DELETE im Hauptdatensatz knallen, weil noch abhängige Daten vorhanden sind

DeddyH 24. Apr 2023 14:17

AW: Firebird Subtabelle plötzlich komplett leer
 
Bei NO ACTION kann der übergeordnete Datensatz nicht gelöscht werden, da sonst die referenzielle Integrität verletzt würde.

BlueStarHH 25. Apr 2023 18:49

AW: Firebird Subtabelle plötzlich komplett leer
 
Zitat:

Zitat von Lemmy (Beitrag 1521473)
was sagt gfix zu der Datenbank? (gfix -v -full....)?

Summary of validation errors
Number of record level warnings : 1
Number of pointer page warnings : 3

Was sagt das mir?

BlueStarHH 25. Apr 2023 18:52

AW: Firebird Subtabelle plötzlich komplett leer
 
Es ist heute wieder passiert. Wieder alle Datensätze der Subtabelle weg. Garantiert habe ich seit dem letzten mal kein SQL-Statement selbst ausgeführt. Maximal 5 Hauptdatensätze gelöscht. Kann IBDAC evtl. einen Fehler haben, dass durch das ON DELETE CASCADE dann ALLE Datensätze in der Subtabelle gelöscht werden und nicht nur die Datensätze die zu den Hauptdatensätzen gehören? Wie kann ich das sinnvoll loggen?

hoika 25. Apr 2023 19:02

AW: Firebird Subtabelle plötzlich komplett leer
 
Hallo,
hast Du vielleicht Trigger drauf?

himitsu 25. Apr 2023 19:33

AW: Firebird Subtabelle plötzlich komplett leer
 
Zitat:

Zitat von hoika (Beitrag 1521541)
hast Du vielleicht Trigger drauf?

Zitat:

Zitat von BlueStarHH (Beitrag 1521540)
Wie kann ich das sinnvoll loggen?

Auch mit einem Trigger. :D

hoika 25. Apr 2023 19:37

AW: Firebird Subtabelle plötzlich komplett leer
 
Hallo,
Summary of validation errors
Number of record level warnings : 1
Number of pointer page warnings : 3

Was sagt das mir?


Das deine DB beschädigt ist.

https://ib-aid.com/ru/articles/how-t...bird-database/

IBExpert 25. Apr 2023 23:29

AW: Firebird Subtabelle plötzlich komplett leer
 
bau dir auf deine Tabelle einen trigger, der ondelete eine exception aufruft


CREATE EXCEPTION SHIT 'Shit';


CREATE OR ALTER trigger VORGANGPOSSER_ad9999 for VORGANGPOSSER
active after delete position 9999
AS
begin
exception shit;
end;

commit;


wenn das beides auf deiner Tabelle aktiv ist, kannst du davon ausgehen, das jeder delete in die exception läuft und wo auch immer der herkommt, die exception sichtbar sein sollte, es sei denn da sind die üblichen leeren except blöcke im delphi code zwischen except und end.

Wenn deine db binäre defekte hat, wie man an deinen validation errors sieht, mach erst mal backup/restore der datenbank. Wenn es dabei fehler gibt, musst du auf der ebene repair machen, bevor es sinn ergibt, die fehlenden Records zu hinterfragen.

Lemmy 26. Apr 2023 06:08

AW: Firebird Subtabelle plötzlich komplett leer
 
Zitat:

Zitat von hoika (Beitrag 1521543)

:thumb:

BlueStarHH 26. Apr 2023 09:34

AW: Firebird Subtabelle plötzlich komplett leer
 
Zitat:

Zitat von IBExpert (Beitrag 1521546)
bau dir auf deine Tabelle einen trigger, der ondelete eine exception aufruft.

Erledigt und auf Funktion getestet. Exception wird angezeigt.
DB ist nun auch repariert. Ich bin gepannt, was nun passiert. Wenn die Daten wieder weg sind, gebe ich hier Rückmeldung.
Danke an alle schon ein mal!


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:00 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