![]() |
AW: Firebird Reihenfolge der Tabellen bei Insert mit Foreignkey
Zitat:
Das meint er. |
AW: Firebird Reihenfolge der Tabellen bei Insert mit Foreignkey
Das ist ja wohl klar, aber woher soll die Datenbank bzw. die Systemtabellen das wissen ? Kenne so etwas nur von schlecht programmierten Programmen. Insofern ist die Nachfrage für mich dann doch eher irrelevant.
|
AW: Firebird Reihenfolge der Tabellen bei Insert mit Foreignkey
Wenn Foreign Keys da sind muss die Reihenfolge stimmen. Ansonsten tritt ein Fehler auf und das ist ja wohl mehr als korrekt
|
AW: Firebird Reihenfolge der Tabellen bei Insert mit Foreignkey
Hallo Hansa,
ich verwende sehr intensiv referenzielle Integrität. Tabellen haben Abhängigkeiten (Foreign Keys) Als Beispiel die Tabelle BelegPos referenziert auf die Tabelle Belege. Ich kann also nicht Belege löschen und dabei die BelegPositionen stehen lassen. Das Bedeutet auch, wenn ich Datensätze in die Datenbank inserte, muss ich zuerst die Datensätze der Tabelle Belege inserten erst danach kann ich die Datensätze für BelePos inserten. Wenn das Datenbankschema wächst mit mehreren hundert Tabellen wird es unübersichtlich und gefährlich selbst die Tabellenreihenfolge zu setzen. Im meinem Fall benötige ich die Funktion für ein automatisierten Restore aus einem Backup der Datenbank. Mein Anwender macht also ein Backup jeden Tag. Solange nichts passiert, ist alles gut. Wenn jedoch in der Datenbank durch User Fehler Daten gelöscht werden, soll es möglich sein seine aktuelle Datenbank so zu belassen wie sie ist und aus dem Backup die Fehlenden Datensätze zu rekonstruieren. Dabei ist es eben wichtig in der richtige Reihenfolge zu inserten wegen Foreign Key. Die Funktionalität in einer StoredProc zu haben ist sehr interessant. Ich habe die StoredProc jetzt mit mehreren Datenbanken getestet und sie funktioniert einwandfrei. Was noch zu testen ist, wenn zirkulare Referenzen(Eine Tabelle referenziert sich selbst durch Foreign Key) verwendet werden. Schöne Grüße Kostas |
AW: Firebird Reihenfolge der Tabellen bei Insert mit Foreignkey
Zitat:
|
AW: Firebird Reihenfolge der Tabellen bei Insert mit Foreignkey
Hallo Hansa,
:-) das ist mir alles durchaus bekannt. Ich habe eine Ahnung von Datenbank Design. Was mich jedoch wundert ist, wenn Du eine Ahnung von Datenbank Design hast, warum begreifst du nicht warum ich die Reihenfolge der Tabellen benötige wenn ich erwähne das ich Foreign Keys verwende? Andere haben es doch auch kapiert! Sorry, vermutlich habe ich etwas übersehen zu erwähnen. Also nochmal: Ich verwende bewusst referenzielle Integrität, ich nutze Cascade Delete wo es Sinn macht, ich nutze bei Foreign Keys immer cascade update außer wenn ich es bewusst nicht einsetze. Bei referenzielle Integrität ist die Reihenfolge der Tabellen bei Inserts elementar wichtig. Gruß Kostas |
AW: Firebird Reihenfolge der Tabellen bei Insert mit Foreignkey
Zitat:
Die Select Statements darin arbeiten auch mit Views, die da einfach nicht reingehören. Die Tabelle mit der "Reihenfolge" der Tabellen enthält faktisch keine Reihenfolge, sondern nur Tabellennamen, deren Reihenfolge sowohl beim Befüllen als auch beim späteren Auslesen nicht definiert ist. (Selbst wenn man davon ausgeht, dass die ID Spalte vlt. über einen Generator befüllt wird.) Außerdem scheint mir die Verwendung der Indexnamen fragwürdig, aber vielleicht ist das ja bei Firebird fest vorgegeben. |
AW: Firebird Reihenfolge der Tabellen bei Insert mit Foreignkey
Hallo Jobo,
danke für den Hinweis mit den Views, werde ich noch herausfiltern. Die Reihenfolge der Tabelle scheint soweit ich es bis jetzt getestet habe, korrekt zu sein. Die Tabellen werden in der richtigen Reihenfolge abgerufen über das Feld ID
Code:
Mal sehen was weitere Tests ergeben, aber wie gesagt, bis jetzt stimmt es.
SELECT RDB$RELATION_NAME
FROM TABLES_ORDERED ORDER BY ID Danke und schöne Grüße. Kostas |
AW: Firebird Reihenfolge der Tabellen bei Insert mit Foreignkey
Zitat:
Zitat:
Zitat:
|
AW: Firebird Reihenfolge der Tabellen bei Insert mit Foreignkey
Die Version ohne Views.
Code:
create or alter procedure ORDER_ALLTABLES
as declare variable COUNTNEWINSERTS integer; declare variable NEWINSERTS integer; begin /* http://firebird-support.yahoogroups.narkive.com/XPYLG1la/odp-firebird-support-listing-table-of-database-in-order-of-dependency */ delete from tables_ordered; INSERT INTO TABLES_ORDERED(RDB$RELATION_NAME) SELECT RDB$RELATION_NAME FROM RDB$RELATIONS r WHERE RDB$SYSTEM_FLAG=0 AND RDB$RELATION_TYPE = 0 /* nur Tabellen */ AND NOT EXISTS(SELECT * FROM RDB$INDICES i WHERE r.RDB$RELATION_NAME=i.RDB$RELATION_NAME AND i.RDB$FOREIGN_KEY IS NOT NULL); select count(*) from tables_ordered into :countNewInserts; newInserts = 0; while (1=1) do begin INSERT INTO TABLES_ORDERED(RDB$RELATION_NAME) SELECT RDB$RELATION_NAME FROM RDB$RELATIONS r WHERE RDB$SYSTEM_FLAG=0 AND RDB$RELATION_TYPE = 0 /* nur Tabellen */ AND NOT EXISTS(SELECT * FROM TABLES_ORDERED o /*Ignore tables already inserted*/ WHERE r.RDB$RELATION_NAME = o.RDB$RELATION_NAME) AND NOT EXISTS(SELECT * FROM RDB$INDICES i /*Only insert tables whose foreign key tables are inserted already*/ JOIN RDB$INDICES i2 ON i.RDB$FOREIGN_KEY = i2.RDB$INDEX_NAME AND r.RDB$RELATION_NAME <> i2.RDB$RELATION_NAME /*Omit this line if you don't want to include tables pointing to themselves*/ LEFT JOIN TABLES_ORDERED o ON i2.RDB$RELATION_NAME = o.RDB$RELATION_NAME WHERE r.RDB$RELATION_NAME=i.RDB$RELATION_NAME AND i.RDB$FOREIGN_KEY IS NOT NULL AND o.ID IS NULL); select count(*) from tables_ordered into :newInserts; if (countNewInserts <> newInserts)then begin countNewInserts = newInserts; end else break; end end |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:22 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz