![]() |
Datenbank: Firebird • Version: 2.5 • Zugriff über: FireDAC
Tabellen richtig mit Constaints darstellen
Hallo frohes neues 2015
Ich habe da eine kleine Datenback mit Abhängigkeiten, Constraints Wie bekomme ich es richtig hin die Abhängifkeiten, mithilfe von TDBTable, dies in zwei DBGrids darzustellen. Also wenn COUNTER sich ändert die Abhängigkeit von TOMAIN im GRID mit der richtigen Datenmenge dargestellt wird.
SQL-Code:
CREATE GENERATOR GENDIRINFO; CREATE TABLE DIRINFO ( COUNTER BIGINT NOT NULL, PRINT BOOLEAN /* BOOLEAN = SMALLINT CHECK (value is null or value in (0, 1)) */, LOCATION STRING50 /* STRING50 = VARCHAR(50) */, PLACE STRING50 /* STRING50 = VARCHAR(50) */, DESCRIPTION STRING50 /* STRING50 = VARCHAR(50) */, PFAD STRING50 /* STRING50 = VARCHAR(50) */ ); ALTER TABLE DIRINFO ADD CONSTRAINT PK_DIRINFO PRIMARY KEY (COUNTER); CREATE GENERATOR GENFILENAMES; CREATE TABLE FILENAMES ( COUNTER BIGINT NOT NULL, TOMAIN BIGINT, FILENAME STRING50 /* STRING50 = VARCHAR(50) */, PATH STRING80 /* STRING80 = VARCHAR(80) */, "SIZE" DOMBIG /* DOMBIG = BIGINT */, "DATE" DOMCHAR21 /* DOMCHAR21 = CHAR(21) */ ); ALTER TABLE FILENAMES ADD CONSTRAINT PK_FILENAMES PRIMARY KEY (COUNTER); /* Foreign Keys */ ALTER TABLE FILENAMES ADD CONSTRAINT FK_FILENAMES_1 FOREIGN KEY (TOMAIN) REFERENCES DIRINFO (COUNTER); |
AW: Tabellen richtig mit Constaints darstellen
Hast du dir schon das Tutorial zu
![]() |
AW: Tabellen richtig mit Constaints darstellen
Nein Uwe Danke
Ich verstehe nicht warum die nicht einfach ein paar PDF erstellen die man abarbeiten kann. |
AW: Tabellen richtig mit Constaints darstellen
Ein Feld, daß als PrimaryKey fungiert, "Counter" zu benennen ist ja schon richtig aussagekräftig.
Da Dateinamen eine ziemlich feste Beziehung zu Unterverzeichnissen pflegen, was willst Du da ändern? Im Allgemeinen werden Daten und nicht die Beziehung von Daten untereinander dargestellt, darum irritiert mich Dein Frage ein wenig. Gruß K-H Zitat:
|
AW: Tabellen richtig mit Constaints darstellen
Danke Uwe:thumb:
nun geht es wie es sein soll. Ein frage habe ich da noch. Für was habe ich dann die Constraints in der Datenbank ? Schönes 2015 |
AW: Tabellen richtig mit Constaints darstellen
Damit das DBMS diese sicherstellt und auch automatisch entsprechnend benötigte Indizes erstellt.
|
AW: Tabellen richtig mit Constaints darstellen
Zitat:
|
AW: Tabellen richtig mit Constaints darstellen
Zitat:
Primärschlüsselconstraints und Fremdschlüsselconstraints. Sie haben in der Tat nichts mit dem Delphicode und der Master Detail Mechanik, die Du erzielen möchtest zu tun. Du kannst die Constraints löschen, ohne dass die Funktion Deines Programms beeinträchtigt ist. Diese beiden und andere Arten von Constraints definieren serverseitige Regeln, die in Deinem Fall u.a. die Datenkonsistenz garantieren! Ja, garantieren. Klingt vielleicht banal, ist es aber nicht. Beispiel 1: Deinem Delphiprogramm ist es vermutlich erstmal egal, wenn ein Masterdatensatz gelöscht wird, auch wenn noch Detaildatensätze angezeigt werden. Dein Programm wird diese Daten auch nie wieder anzeigen, also könnte es fast egal sein. Machst Du aber bspw. einen Report über Deine Daten, wirst Du nie auf die richtigen Zahlen kommen. Weil Du Leichen im Keller hast. Ein DB Server speichert eben nicht nur stumpf Daten, es geschieht viel mehr, sofern definiert. Und das unabhängig davon, wie gut oder schlecht das zugreifende Programm ist. Kleiner Wermutstropfen: Der Server garantiert zwar die Einhaltung gewisser Regeln, er nimmt Dir aber leider nicht ab, die aus Regelverletzung resultierenden Fehler abzufangen. Beispiel 2: Löscht Du bei der Constraint Definition oben einen Datensatz aus der Mastertabelle, auf den bereits Detaildatensätze verweisen, wird der Server einen Fehler erzeugen (eine häßliche Meldung auswerfen, die eigentlich niemand sehen will) und den Datensatz nicht löschen. Probier es aus, entferne den Foreign Key Constraint und von da an, ist dem Server egal, was Du löscht. Umgekehrt kannst Du die Foreign Key Definition so erweitern, das abhängige Datensätze gleich mitgelöscht werden, praktisch, aber vielleicht etwas überraschend für den Anwender. Dinge wie automatisch erzeugte Indizes auf Schlüsselfeldern sind ein (meist sinnvolles) Geschenk der DB Hersteller. Eigentlich macht man auch das häufig selbst, da man dann z.B. die Namensgebung des Index und seine Art kontrollieren kann. |
AW: Tabellen richtig mit Constaints darstellen
Zitat:
Code:
Ist Result > 0, erfolgt eine Meldung für den Anwender, die ihm mitteilt, daß der Datensatz nicht gelöscht werden kann, weil er noch in Verwendung ist. Oder optional eine MessageDlg, die fragt, ob die entsprechende Spalte aller Datensätze der Mastertabelle, die diesen Datensatz der Detailtabelle verwenden, mit Null oder 0 (steht bei mir meist für '_unbekannt') aktualisiert werden sollen: 'Wenn Sie den Eintrag "spanisch" dennoch löschen wollen, werden alle Datensätze, die die Sprache "spanisch" aufweisen, der Sprache "_unbekannt" zugeordnet.'
select * count
where Detailspalte = DetailDatensatzID |
AW: Tabellen richtig mit Constaints darstellen
Genauso könntest Du auf die Exception/den Returncode reagieren.
Zudem werden die Contraints im Datenbankschema auch von anderen Verbindungen auch von Zugriffen ausserhalb des Programmes beachtet und erzwungen. Zudem kann eine Datenbankadmintool diese verwenden ( Filterung beim Insert usw.) Deshalb würde ich nicht auf dieses sinnvollen Features verzichten. Der vorgeschlagene Weg funktioniert zudem auchg mit angelegten Constraints. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:44 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