|
![]() |
Gast
Datenbanken / Grundlagen Teil 1 (InterBase)
Datenbank anlegen 1.) - InterBase Interaktive SQL Als alle erste werden wir z. B. in dem Verzeichnis "Forum" ein Unterverzeichnis "Projekt" anlegen. Und in dem Verzeichnis Projekt werden wir insgesamt 2 leere Unterverzeichnisse anlegen: DataBase, Source Bei laufendem (!!!) InterBase Server starten wir den InterBase Windows ISQL: Menü File/Create Database --> Local Engine Database --> C:\Foruml\Projekt\DataBase\DForum.gdb User Name --> SYSDBA Password --> masterkey (keine großen Buchstaben)): OK drücken und dann File/Exit. Somit hat man zuerst eine leeres InterBase Datenbank erstellt...Du findest jetzt in dem Verzeichnis C:\Foruml\Projekt\DataBase\ Eine Datei Namens Dforum.gdb =========================== ____________________ 2.) – SQL-Explorer Den SQL-Explorer starten: Delphi – Menü: Datenbank/Explorer: ____________________ 3.) – ALIAS FORUM ->> Die erste Tabelle: KUNDE 1.) Datenbanken / ALT-F10 und Neu (oder mit Tastenkombination Strg+N) gelangstDu in „Neuer Datenbank-Alias“ Fenster Wähle hier als Datenbank-Treibername INTRBASE und OK. F2 - das Überschrift INTRBASE1 durch FORUM ersetzen 2) SERVER NAME --> C:\Foruml\Projekt\DataBase\DForum.gdb USER NAME --> SYSDBA LANGDRIVER --> 'WEurope' ANSI Jetzt Strg+S und speichern unter „Forum“ (Alias) Anmelden in einer Datenbank (Datenbak-Login) 1.) Menü Objekt/Öffnen Benutzername --> SYSDBA Paßwort: --> masterkey Tabellen / Spalten 1.) Das „+“ Zeichen neben FORUM mit ALT+ --> öffnen. 2.) Gehe jetzt auf Tabellen und Strg+N und TABLE1 durch KUNDE ersetzen. 3.) Gehe jetzt auf Spalten und mit Strg+N lege so viele Spalten wieviel benötigt wird. und benenne diese entsprechend (F2)
Code:
____________________
ID vom Typ --> INTEGER (keine Null- Werte zulassen)
ERFASSUNGSDATUM vom Typ --> DATE KUNDENART vom Typ --> SMALLINT (keine Null- Werte zulassen) KUNDENNUMMER vom Typ --> VARCHAR(20) (keine Null- Werte zulassen) FIRMA vom Typ --> VARCHAR(30) (keine Null- Werte zulassen) STRASSE vom Typ --> VARCHAR(30), PLZ vom Typ --> VARCHAR(10), ORT vom Typ --> VARCHAR(30), TELEFONNR vom Typ --> VARCHAR(20), TELEFAXNR vom Typ --> VARCHAR(20), ADRESSE_AKTIV vom Typ --> SMALLINT KONTAKTART vom Typ --> SMALLINT KREDITINSTITUT vom Typ --> VARCHAR(30) KONTONR vom Typ --> VARCHAR(20) BLZ vom Typ --> VARCHAR(10) Primärschlüssel 1.) Strg+N - Die Tabelle nennen wir KUNDE_PK und den Primärschlüssel legen wir auf die erste Spalte ID aus unserer KUNDE Tabelle. ____________________ Generatoren 1.) Strg+N - Die Tabelle nennen wir KUNDE_ID_GEN 2.) Speichere jetzt bitte die Generatoren in dem Du auf KUNDE_ID_GEN mit rechten Maustaste anklickst (oder ALT-F10) und Übernehmen auswählen. ____________________ Felder deklarieren ____________________ Achtung: Solange die kleine Pfeilen (> ) rot sind läßt sich die Datenbank nicht abspeichern, darum müssen z. B. alle Spalten mit Typen versehen werden. Um zwischen den Spalten- Namen und der Definition, Text und SQL-Eingabe zu springen benutze bitte (außer Maus) die Taste F12 und Teilweise Tabulator. Um das Menü mit den Datentypen zu öffnen halte die Alt- Taste und drücke Pfeil nach unten (Alt+Pfeil nach unten). Um den Wert in Nullzeichenzeile zu ändern halte die Strg-Taste und drücke Return (Strg+Eingabe). Die Kombination Strg+P wechselt hin und her in dem linken Explorerfenster die Spalten: Wenn Du alles richtig gemacht hast dann siehst Du im Textfenster von Tabel1 folgendes:
Code:
____________________
CREATE TABLE KUNDE (
ID INTEGER NOT NULL, ERFASSUNGSDATUM DATE, KUNDENART SMALLINT NOT NULL, KUNDENNUMMER VARCHAR(20) NOT NULL, FIRMA VARCHAR(30) NOT NULL, STRASSE VARCHAR(30), PLZ VARCHAR(10), ORT VARCHAR(30), TELEFONNR VARCHAR(20), TELEFAXNR VARCHAR(20), ADRESSE_AKTIV SMALLINT, KONTAKTART SMALLINT, KREDITINSTITUT VARCHAR(30), KONTONR VARCHAR(20), BLZ VARCHAR(10) ) Triggers 1.) Strg+N - Die Tabelle nennen wir KUNDE_ID_GEN 2.) in dem Texteditor tragen wir zusätzlich ein:
Code:
3.) In den Triggers/ Definition von: KUNDE_ID_GEN den Typ BEFORE INSERT einzutragen.
CREATE TRIGGER KUNDE_ID_GEN FOR KUNDE AFTER UPDATE POSITION 0 AS
BEGIN NEW.ID=GEN_ID(KUNDE_ID_GEN,1); END Speichern Jetzt auf das Überschrift FORUM und ALT F10 – Übernehmen ================================= Dieses Thema hier...die Du geöffnet hast muss aber so behandelt werden, dass auch Umsteiger bzw. Anfänger zu Recht kommen dürfen...um unsere Beispiele hier nachvollziehen zu können... Man spricht immer InterBase dies...InterBase das...aber viele wissen in der Wirklichkeit nicht es richtig auszunutzen... Vor allem Trigger und Generatoren bereiten manchen echte Kopfschmerzen... ...nun noch ein paar Worte zu Meiner Frage nach BEFORE INSERT....also nach Triggers... ___________ Triggers
Code:
__________________________________________________ ____________
CREATE TRIGGER KUNDE_ID_GEN FOR KUNDE BEFORE INSERT POSITION 0 AS
BEGIN NEW.ID = GEN_ID(KUNDE_ID_GEN, 1); END Triggers sind nichts anders als kleine Routinen die aus drei Teilen bestehen. 1.) Name 2.) Eine Bedingung 3.) Hauptblock also den Ausführungsteil Hauptsächlich dienen Triggers zu Datenmodifikation indem die in den Trigger enthaltene Anweisungen ausgeführt werden. In dem Sinne bestimmt hier z.B. BOFORE INSERT der "Zeitpunkt" WANN sollte der Trigger ausgeführt werden.... Später in der Anwendung um z.B.: einen neuen Datensatz einzufügen verwendet man: Table1.Append; Also wird ein neuer Datensatz erzeugt...Nun stellt sich hier die Frage...: WANN SOLLTE DIE NEUE ID GENERIERT WERDEN? Nun die günstigste Konstellation für einen neunen Datensatz ist natürlich BEFORE INSERT..., da schon hier:
Code:
Hier wäre auch zu vermerken das nur ein Eigentümer einer Tabelle kann einen Trigger erstellen.
VAR
xID : Integer; BEGIN Table1.Append; //bekommt die neue ID einen Wert zugewiesen...somit ist die neue ID bekannt...und man kann das so nachprüfen: xID := Table1.FieldByName(‚ID').asInteger; END; Definiert man hingegen die Bedingung als AFTER INSERT bekommt man bei unserem ID...spätestens beim Datensatz speichern eine Exception.... Ein Trigger kann aber auch so aussehen:
Code:
Dann mit der SQL-Anweisung
CREATE TRIGGER KUNDE_DELETE FOR KUNDE BEFORE DELETE POSITION 0 AS
BEGIN delete from adress where id_kunde = old.id; delete from auftrag where id_kunde = old.id; END
Code:
wird nicht NUR ein Datensatz mit dem ID = 2 aus der Tabelle Kunde gelöscht...sonder auch (!!!) alle Datensätze aus der Tabellen ADRESS und AUFTRAG die in der Spalte ID_KUNDE den Eintrag 2 haben..., also den Verweis auf die Tabelle Kunden...
DELETE FROM KUNDE
WHERE ID = 2 Diesen wunderbaren Mechanismus... intelligent und gezielt eingesetzt bewart eine Datenbank vor Entstehung der unbeliebten DATENBANK-LEICHEN..., he, he..., also Datensätze die in der "Luft hängen"...Das ist doch logisch: Wird ein Kunde gelöscht hat seine Adresse nichts mehr in der Tabelle Adresse zu suchen !!! Es ist hier auch zu vermerken, dass das ein sehr gefährlicher Mechanismus ist..., da wird ein Kunde gelöscht können auch z.B. alle seine Rechnungen gelöscht werden..., und den Buchhalter muss ins Gefängnis..:
Code:
da würde ich aufpassen…
CREATE TRIGGER KUNDE_DELETE FOR KUNDE BEFORE DELETE POSITION 0 AS
BEGIN delete from RECHNUNG where id_kunde = old.id; END =================================== Zuerst eine Ergänzung: (...) Ein Trigger kann aber auch so aussehen:
Code:
Dann mit der SQL-Anweisung
CREATE TRIGGER KUNDE_DELETE FOR KUNDE BEFORE DELETE POSITION 0 AS
BEGIN delete from adress where id_kunde = old.id; delete from auftrag where id_kunde = old.id; END
Code:
wird nicht NUR ein Datensatz mit dem ID = 2 aus der Tabelle Kunde gelöscht...sonder auch (!!!) alle Datensätze aus der Tabellen ADRESS und AUFTRAG die in der Spalte ID_KUNDE den Eintrag 2 haben..., also den Verweis auf die Tabelle Kunden...
DELETE FROM KUNDE
WHERE ID = 2 (...) _________ ACHTUNG: Das ich hier WHERE ID = 2 Geschrieben habe könnte suggerieren...das nur bei dieser Zuweisung „schnappt“ der Trigger Mechanismus zu...FALSCH!!! Angenommen solche Anweisung:
Code:
bewirkt das 3 Datensätze z.B. mit der ID’s 100, 1234 und 10032 gelöscht werden...Dann bei diese „Lösch-Aktion“ wird natürlich auch der Trigger aktiv...da er WARTET Buchstäblich darauf das ein Datensatz gelöscht wird...und zwar egal, ob mit oder ohne Bedingungen...Hauptsache irgendwas wird gelöscht...(Also wie ein Berufs-Soldat)...da weiß er „Hoppla...ich muss mich da einmischen“...
DELETE FROM KUNDE
WHERE (KUNDENART = 0) AND (ORT = ’USA’) Somit werden auch alle Datensätze in der Tabelle ADRESS und AUFTRAG die in dem Feld ID_KUNDE die Werte 100, 1234 oder 10032 aufweisen....GELÖSCHT... ============================= für weitere Beispiele brauchen wir noch eine Tabelle...sonnst kann man nicht viel zeigen... 4.) – Die zweite Tabelle: ANSPRECHPARTNER Wir vergeben unserer zweiten Tabelle den Namen ANSPRECHPARTNER und benennen entsprechend die Spalten. Wir definieren die Spalten in dem wird den Typ und dem entsprechend die Länge setzen, sowie prüfen wir, ob das Nullzeichen zugelassen wird. Und so z. B. für die Spalte ID wählen wir den Typ Integer (keine Länge) und das Nullzeichen wird nicht zugelassen (also hier muss später immer ein Wert eingetragen werden). Also, von oben nach unten werden die Felder wie folgt benannt:
Code:
Das Feld BEMERKUNGEN definieren wir so:
ID (Integer --> not null)
ID_KUNDE (Integer --> not null) (normalerweise nenne ich dieses Feld KUNDE_ID..., also zuerst TabellenName (KUNDE) und dann FeldName (ID) aber jetzt ist das schon egal) ANREDE (String 15) VORNAME (String 30) NACHNAME (String 30 --> not null) GEBURTSTDATUM (Datum) BEMERKUNGEN (Memo-Feld) Typ: BLOB, Untertyp: Text, Länge: 8 Den Primärschlüssel nennen wir ANSPRECHPARTNER_PK und den Primärschlüssel legen wir auf die erste Spalte ID aus unserer ANSPRECHPARTNER Tabelle fest. Jetzt benennen wir die Generatoren als ANSPRECHPARTNER_ID_GEN Und in dem rechtem Fenster des Explorers unter dem Text erscheint:
Code:
__________________
CREATE GENERATOR ANSPRECHPARTNER_ID_GEN;
SET GENERATOR ANSPRECHPARTNER_ID_GEN TO 0 Jetzt bitte die Generatoren speichern in dem Du auf ANSPRECHPARTNER_ID_GEN mit rechten Maustaste anklicken (oder ALT-F10) und Übernehmen. Letztlich legen wir noch ein Trigger an: mit den Namen ANSPRECHPARTNER_ID_GEN und in dem rechten Fenster im Definition-Editor wählen wir als Typ: BEFORE INSERT an: In dem Texteditor tragen wir zusätzlich (zwischen BEGIN und END) ein: NEW.ID = GEN_ID(ANSPRECHPARTNER_ID_GEN, 1); Wenn Du mit den Feldern fertig bist speicherst Du bitte die Tabelle in dem Du auf Tabellen mit rechte Maustaste anklickst (oder ALT-F10) und Übernehmen auswählst. ================================= alles klar...Jetzt sieht Deine SQL-Anweisung für die Tabelle ANSPRECHPARTNER wie folgt aus:
Code:
==============================
CREATE TABLE ANSPRECHPARTNER (
ID INTEGER NOT NULL, ID_KUNDE INTEGER NOT NULL, ANREDE VARCHAR(15), VORNAME VARCHAR(30), NACHNAME VARCHAR(30) NOT NULL, GEBURTSTDATUM DATE, BEMERKUNGEN BLOB SUB_TYPE 1 SEGMENT SIZE 80 ) User fragt: Hi Paul Jr. Er fragt ob auch noch die Domains eigetragen werden müssen (er hat das in irgendwelchem Buch gelesen) =============================== Antwort: also irgendwas hast Du hier durcheinander gebracht...So geschieht manchmal wenn man eben nur ein Teilauszug und nicht das ganze Buch gelesen hat..., he, he Falls Du noch nicht gemerkt hast sind in unserer Datenbank auf unerklärbare Weise die Domains (DATA DICTIONARY oder wie manche sagen Systemkatalog) schon drin...und wir konnten bis jetzt (wenn auch ohne Daten) unsere Datenbank immer speichern (!?)... Ich würde sagen lassen wir das hier so stehen..., ich komme noch später kurz auf Thema Domains zurück...versprochen... _______________________________ ...nun falls Du aber nichts zu tun hast...öffne bitte den SQL- Explorer...gehe in das Menü Ansicht und wähle hier den Menü-Punkt: Systemdaten... Wenn Du jetzt unsere Datenbank öffnest und gehst auf den Zweig „Tabellen“ siehst Du außer unserer vorher definierten Tabellen noch System-Tabellen dazu...Du kannst Dir die ruhig anschauen... Um an bestimmte Tabellen- Informationen ranzukommen... greife ich manchmal direkt auf diese Tabellen zu. ...nun aber das gehört nicht hier hin...und wird hier auch nicht behandelt! Bis bald...und lese bitte zur Zeit keine Bücher, he, he ============================= An User: da ich jetzt an den nächstem Posting über virtuellen Tabellen arbeite könntest du inzwischen unsere beiden Tabellen KUNDE und ANSPRECHPARTNER mit Daten füllen...mindestens je Tabelle 5 Datensätze. Bevor Du es jedoch machst lege bitte eine Nachschlage- Tabelle KUNDENART ein. Um das zu erreichen öffne bitte den SQL-Explorer. Öffne jetzt unsere Datenbank die unter dem Alias "Forum" zu finden ist (Passwort: masterkey).. Diese Tabelle brauchen wir für die Tabelle KUNDEN wo ich ein Feld unter dem Namen KUNDENART definiert habe. ACHTUNG: Ändere bitte den Namen (KUNDENART) des Feldes in der Tabelle KUNDE auf KUNDENART_ID, das ist ein "Fehler" von mir..., da er einen Verweis auf die Tabelle KUNDENART darstellen sollte. ______________________________ Zurück zu der Tabelle KUNDENART: Diese Tabelle sollte zwei Felder besitzen (ID Integer Not null und Bezeichnung VARCHAR 30) Lege bitte ein Primärschlüssel KUNDENART_PK (auf die Spalte ID) ein, ein Generator KUNDENART_ID_GEN und einen Trigger ebenfalls unter dem Namen KUNDENART_ID_GEN.... __________________________________________ Diese Tabelle solltest Du als erste mit Daten füllen. Markiere bitte jetzt z.B. die Tabelle [-]- KUNDENART und in dem zweiten Fenster wähle bitte die Seite "Daten" aus. Hier trage beiliebige Werte ein wie z.B. [code:1:2e4cf27e0c] ID |
Gast |
Delphi 2010 Professional |
#2
Hallo PaulJr,
in deinem Beitrag erscheint immer wieder die Zeichenfolge ![]() –
Albert
|
![]() |
Delphi 11 Alexandria |
#3
Moin Mr. Spock,
das erscheint beim IE 6 auch. |
![]() |
Christian Seehase |
Öffentliches Profil ansehen |
Mehr Beiträge von Christian Seehase finden |
Delphi 2006 Professional |
#4
Und im IE5.5 auch. Scheint ein Bug im Forum zu sein genau wie beim Euro-Zeichen (€). aber wir sollten die Diskussion verlegen, gehört nicht hier her.
Michael
|
![]() |
Daniel B
|
#5
Hi,
– ist ein minus. Ich glaube das man es so schreiben muss, damit Delphi es nicht als richtiges Minus ansieht und somit CompileFehler bringt. Was würde passieren wenn du - Hallo - Compilieren lässt?!?! Ich hoffe dass das jetzt kein Schmarrn ist. ich kenn mich mit DB nciht aus, könnte es mir aber so vorstellen. |
![]() |
Turbo Delphi für Win32 |
#6
Das hat etwas mit der Konfiguration des Boards zutun. Die Eingabe von Sonderzeichen unter HTML erfolgt durch eingabe eines Sonderzeichencodes ( bspw. – ). Da in diesem Board hier HTML-Tags deaktiviert sind, werden sie Standardmäßig angezeigt (also steht für – auch kein Sonderzeichen sonder –).
Chris1308 PS: Auch wenns nicht hierhin gehört. Sorry, aber wollte ich nurmal gesagt haben. ![]() |
![]() |
|
#7
Was mache ich Falsch ?
Ich habe eine Datenbank Angelegt und die Tabellen und Spalten. So weit so gut. Nur mit dem Tigger klappt das nicht. Erst habe ich den Generator angelegt und übernommen und dann will ich den Tigger anlegen und übernehmen dann kommt die Meldung (Siehe Bild) Was mache ich Falsch ?: ![]()
Mario
|
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs 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
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |