Einzelnen Beitrag anzeigen

alex517

Registriert seit: 23. Nov 2004
Ort: Bernau b. Berlin
273 Beiträge
 
Delphi XE5 Enterprise
 
#17

Re: Allgemeines Datenbankproblem bei SQL Abfrage

  Alt 8. Apr 2009, 09:01
Hallo Jens,

meine Empfehlung:

- Tabelle MB100 und MB256PLUS
Feldtyp von Datum als DATE statt CHAR(10)
Feldtyp von Uhrzeit als TIME statt CHAR( 8)


- Tabelle USER umbenennen in BENUTZER
Feld Benutzer umbenennen in BENUTZER_NAME
für BENUTZER_NAME und PASSWORT statt CHAR VARCHAR verwenden

- Tabelle Config umbenennen in KONFIGURATION o.ä.
Feld ID als Primary Key hinzufügen

- SysDatum und SysTime (einmal deutsch einmal englisch!?)
als TIMESTAMP zusammenfassen.

generell:

- wie schon geschrieben, alle Tabellen, Feldname usw in GROSSBUCHSTABEN
ohne Sonderzeichen und keine reservierten oder Keywords (siehe Link).

- ALLE Tabellen sollten eine ein Feld ID als Primary Key besitzen
Diese ID hat, außer einem eindeutigen Wert, grundsätzlich keine Information.
(und ja, es kann Ausnahmen geben, aber nur in Bezug auf den Inhalt)

- Definiere die eigene Domänen.
Wenn du es nicht machst, mach es Firebird für dich automatisch und zwar
für jeder Feld eine eigene (zu sehen in den Systemtabellen).
Damit verringerst du den den Aufwand den Firebird beim Parsen der Statements hat.
Außerden hast du eine bessere Übersicht über deine verwendeten Feldtypen.

Beispiele:
SQL-Code:
  CREATE DOMAIN DOM_BENUTZER AS VARCHAR(40) COLLATE DE_DE; -- eigene Benutzerverwaltung
  CREATE DOMAIN DOM_BLOB AS BLOB SUB_TYPE 0 SEGMENT SIZE 80;
  CREATE DOMAIN DOM_BOOL AS INTEGER DEFAULT 0;
  CREATE DOMAIN DOM_CHAR10 AS CHAR(10) COLLATE DE_DE;
  CREATE DOMAIN DOM_CURRENCY AS NUMERIC(16,4);
  CREATE DOMAIN DOM_DATE AS DATE;
  CREATE DOMAIN DOM_DATETIME AS TIMESTAMP;
  CREATE DOMAIN DOM_ID AS INTEGER NOT NULL;
  CREATE DOMAIN DOM_LINK AS INTEGER NOT NULL;
  CREATE DOMAIN DOM_LINK_LOOSE AS INTEGER;
  CREATE DOMAIN DOM_INT AS INTEGER;
  CREATE DOMAIN DOM_MEMO AS BLOB SUB_TYPE 1 SEGMENT SIZE 80;
  CREATE DOMAIN DOM_NUM9_2 AS NUMERIC(9,2);
  CREATE DOMAIN DOM_PLZ AS CHAR(7) DEFAULT '';
  CREATE DOMAIN DOM_PROZENT AS NUMERIC(9,2);
  CREATE DOMAIN DOM_TIME AS TIME;
  CREATE DOMAIN DOM_VCHAR10 AS VARCHAR(10) COLLATE DE_DE;
  CREATE DOMAIN DOM_VCHAR100 AS VARCHAR(100) COLLATE DE_DE;
  ....
- Boolsche Werte als INTEGER (0/1)

- jede Tabelle bekommt Felder aus denen zu ersehen ist wann und von wem der
Datensatz angelegt und das letzte mal geändert wurde.
Das Eintragen diese Werte erfolgt über Before-Trigger die beim Insert und
Update gefeuert werden. Damit ist allein Firebird bzw. der Rechner aus dem Firebird
läuft für der Inhalt zuständig und nicht irgendein Client-Rechner oder das Programm.
Hilft ungemein beim Interpretieren der Daten, bei der Fehlersuche und
beim "Bewerten" von Kundenaussagen.


Beispiel:
DC, DM sind DOM_DATETIME,
UC, UM sind DOM_BENUTZER


SQL-Code:
CREATE OR ALTER TRIGGER TRIG_TESTTAB_BIU FOR TESTTAB
ACTIVE BEFORE INSERT OR UPDATE POSITION 1
AS
BEGIN

  IF(NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GEN_TESTTAB_ID, 1);

  if (inserting) then
  begin
    NEW.DC = current_timestamp;
    NEW.UC = CURRENT_USER;
    /* oder wie bei uns über eine Prozedur wenn nicht mit
      unterschiedlichen Firebird-Usern gearbeitet wird
       EXECUTE PROCEDURE SP_GET_CURRENT_USER RETURNING_VALUES NEW.UC; */

  end

  if (updating) then
  begin
    NEW.DM = current_timestamp;
    NEW.UM = CURRENT_USER;
    /* EXECUTE PROCEDURE SP_GET_CURRENT_USER RETURNING_VALUES NEW.UM; */
  end
END

alex
Alexander
  Mit Zitat antworten Zitat