Autor Beitrag
e86
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Windows XP SP2
C# (VS 2005 C# Express); Object Pascal (Delphi7 Prof.)
BeitragVerfasst: Di 03.01.06 14:02 
Hallo,

ich suche für das Firebird-Datenbanksystem folgende SQL-Befehle, die mir folgendes bewirken:

- Das Zurückgeben von allen Tabellennamen einer bestimmten Datenbank
- Das Zurückgeben aller Eigenschaften der Tabellen einer Datenbank ODER das Zurückgeben aller Eigenschaften aller Tabellen einer Datenbank
- Das Zurückgeben der Eigenschaften von den Spalten einer bestimmten Tabelle


Dies benötige ich in Verbindung mit .NET, was hier aber ersteinmal nicht wichtig ist. Ich habe schon die Dokumentationen größtenteils konsultiert, nur leider nichts dazu gefunden. Wäre über Links, Tips etc. sehr dankbar.


kOOni
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Di 03.01.06 14:26 
3. Versuch einer Antwort !

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
begin
  DbDS.Close;
  DbDS.SelectSQL.Text := 'select RDB$RELATION_NAME from rdb$relations order by RDB$RELATION_NAME';
  DbDS.Open;
  DbDS.First;
  i := 0;
  while not DbDS.Eof do begin
    i := i + 1;
    DetailDS.Close;
    DetailDS.SelectSQL.Text := 'select count (*) AS ANZAHL from '+DbDS.FieldByName ('RDB$RELATION_NAME').AsString;
    DetailDS.Open;
    TableName := DbDS.FieldByName ('RDB$RELATION_NAME').AsString;
    Anzahl := DetailDS.FieldByName ('ANZAHL').AsString;
    if pos ('$',TableName) = 0 then begin
      if StrToInt (Anzahl) <> 0 then
        Memo1.Lines.Add(Tablename + blanks (20-length (TableName))  + '  '+ Anzahl)
      else
        Memo2.Lines.Add(Tablename + blanks (20-length (TableName))  + '  '+ Anzahl);
    end;
    DbDS.Next;
  end;
end;


Was soll das, nach dem Schreiben eines Beitrages zum Login aufgefortert zu werden ? :shock: Natürlich mit Verlust des Textes ? Das hat langsam keinen Zweck mehr. Deshalb jetzt kommentarlos. 8)

_________________
Gruß
Hansa
e86 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Windows XP SP2
C# (VS 2005 C# Express); Object Pascal (Delphi7 Prof.)
BeitragVerfasst: Do 05.01.06 14:38 
Hallo,

danke dir für deine Antwort. Scheint so, als wären die SQL-Befehle in Firebird völlig anders, als in MySQL.

Was macht dieser Befehl?

ausblenden Delphi-Quelltext
1:
select RDB$RELATION_NAME from rdb$relations order by RDB$RELATION_NAME					


Hättest du vielleicht einen guten Link für eine allgemeine Befehlsübersicht? In IbPhänix habe ich nichts gefunden ...


kOOni
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Do 05.01.06 14:47 
Da alle Datenbankobjekte einer FB-Datenbank( wie bei den meißten Datenbanken) ebenfalls in Datenbanken abgelegt werden, kann man diese mit den normalen SQL-Befehlen auslesen.
Die Tabellen ( Systemtabellen) beginnen in FB mit dem Suffix RDB$.

RDB$RELATIONS beinhaltet die Tabellen, RDB$RELATION_FIELDS die Felder usw.

Dokus gibt es unter <a href="http://www.ibphoenix.com">IBPHOENIX</a>

_________________
Markus Kinzler.
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Do 05.01.06 21:28 
xy< SASCS

_________________
Gruß
Hansa
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Do 05.01.06 21:39 
und wieder halbe Seite futsch. Leider nicht vorher kopiert. Wenn das hier ankommt : das vorhin war ein Test. Jetzt heißt es : du kannst nur deine eigenen Beiträge bearbeiten, was ich ja tun wollte. 8)

_________________
Gruß
Hansa
hansa
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3079
Erhaltene Danke: 9



BeitragVerfasst: Do 05.01.06 21:50 
Zwischen 3 mal und 10 mal Login, obwohl sowieso eingeloggt, dann kommt der Beitrag an. :hair: Völlig unzumutbar. Und von Hand wurde kein Passwort eingegeben oder sonst was. :x Probiere jetzt max. 10 mal eine Antwort zu schreiben, deshalb nur kurz :

Das erste Select ermittelt alle vorhandenen Tabellen. Die gehe ich dann durch und ermittele per COUNT (*) die Anzahl der enthaltenen Datensätze. Für Tabelle ohne $ im Namen zeige ich dann Name und Anzahl DS an.

_________________
Gruß
Hansa
e86 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Windows XP SP2
C# (VS 2005 C# Express); Object Pascal (Delphi7 Prof.)
BeitragVerfasst: Sa 07.01.06 19:43 
Hallo,

also ich habe mich etwas eingelesen in Firebird. Auf IBPhönix habe ich nur folgende Dokumentation gefunden, welche aber sehr unzureichend für mich ist.

FB 2.0 Release Notes

Nach einer Suche in der Knowledgebase wurde ich fündig (dazu siehe [url=http://www.ibphoenix.com/main.nfs?a=ibphoenix&l=;KNOWLEDGEBASE;ID='72']hier[/url] ):

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
SELECT RDB$RELATION_NAME
FROM RDB$RELATIONS
WHERE ((RDB$SYSTEM_FLAG = 0) OR
(RDB$SYSTEM_FLAG IS NULL)) AND
(RDB$VIEW_SOURCE IS NULL)
ORDER BY RDB$RELATION_NAME


Dieser Code bewirkt, dass ich alle Nicht-Systemtabellen angezeigt bekomme. Nur dabei sind auch Tabellen "IBE$", welche aber nicht von mir sind. Wie kann ich hier nur die bekommen, welche nur von "mir" sind? Also welche von irgendwelchen Usern erstellt wurden und nicht vom System selber.

Bei dem Statement bekomme ich scheinbar die Informationen über die verschiedenen Tabellen:

ausblenden Quelltext
1:
2:
3:
4:
SELECT RDB$RELATION_NAME
FROM RDB$RELATIONS
WHERE (RDB$VIEW_SOURCE IS NULL)
ORDER BY RDB$RELATION_NAME


Aber das Ergebnis sieht ungefähr so aus:

ausblenden Quelltext
1:
2:
3:
4:
IBE$AUTO_FIELDS
IBE$CATEGS                     
IBE$CHAMPS                     
...


Meine Frage ist nun: Wie kann ich auf diese Eigenschaften einer speziellen Tabelle zugreifen?

Wenn ich mir das jetzt richtig gedacht habe, müsste ich dann folgendes haben:

- Alle Tabellennamen einer Datenbank
- Alle Informationen einer Datenbank

Noch etwas. Ich arbeite mit IBEasy+, was sehr schön ist. Damit kann man schnell SQL-Statements senden. Ich habe bis jetzt nur mit MySQL gearbeitet und finde Firebird sehr komisch vom Aufbau und der Abfrage her, aber ich glaube, das gibt sich, wenn ich mich noch weiter damit befasse. Danke für die Antworten und Bemühungen bis jetzt und möge der Hansa nun auch mal ohne Wiedereinloggen posten können :P


kOOni
ps.: hättet ihr noch mehr Links für mich?
e86 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Windows XP SP2
C# (VS 2005 C# Express); Object Pascal (Delphi7 Prof.)
BeitragVerfasst: Sa 07.01.06 22:56 
N' abend,

e86 hat folgendes geschrieben:
Wie kann ich hier nur die bekommen, welche nur von "mir" sind? Also welche von irgendwelchen Usern erstellt wurden und nicht vom System selber.


Diese Frage hat sich erledigt. Habe dazu folgendes konstruieren können :)

ausblenden SQL-Anweisung
1:
2:
select * from rdb$relations where NOT (RDB$RELATION_NAME LIKE 'IBE$%'AND NOT (RDB$RELATION_NAME LIKE 'RDB$%')
ORDER BY RDB$RELATION_NAME


Dabei werden alle Tabellen angezeigt, die nur von Usern kreiert wurden.


kOOni

Moderiert von user profile iconUGrohne: Quote-Tag korrigiert.
Moderiert von user profile iconUGrohne: Code- durch SQL-Tags ersetzt
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Sa 07.01.06 23:13 
user profile icone86 hat folgendes geschrieben:

Meine Frage ist nun: Wie kann ich auf diese Eigenschaften einer speziellen Tabelle zugreifen?

Wenn ich mir das jetzt richtig gedacht habe, müsste ich dann folgendes haben:

- Alle Tabellennamen einer Datenbank

select rdb$field_name from rdb$relation_fields where rdb$relation_name = '<tabellenname>';
Zitat:

- Alle Informationen einer Datenbank

Verteilt in viele Systemtabellen.
Zitat:

Noch etwas. Ich arbeite mit IBEasy+, was sehr schön ist. Damit kann man schnell SQL-Statements senden. Ich habe bis jetzt nur mit MySQL gearbeitet und finde Firebird sehr komisch vom Aufbau und der Abfrage her,
?
Zitat:
aber ich glaube, das gibt sich, wenn ich mich noch weiter damit befasse. Danke für die Antworten und Bemühungen bis jetzt und möge der Hansa nun auch mal ohne Wiedereinloggen posten können :P


kOOni
ps.: hättet ihr noch mehr Links für mich?


Kann man sich bei IBEasy+ die Systemtabellen anzeigen lassen. Ich verwende IBexpert, von welchem es unter www.ibexpert.com eine freie Personal Edition gibt.

Gru? Markus.

_________________
Markus Kinzler.
e86 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Windows XP SP2
C# (VS 2005 C# Express); Object Pascal (Delphi7 Prof.)
BeitragVerfasst: Sa 07.01.06 23:23 
Hallo Markus.

Danke für die Antwort. Ich weiß nicht, ob es das richtige SQL-Statement war... *G* Aber ich bekomme als Result von IbEasy+ folgende ÜBersicht:

RDB$FIELD_NAME
Null

RDB$RELATION_NAME
Null

RDB$FIELD_SOURCE
Null

RDB$QUERY_NAME
Null

RDB$BASE_FIELD
Null

[...]

RDB$FIELD_ID
Null

[...]


Ich zweifle deshalb etwas, weil alle Spalten mit "null" belegt sind und keine ausgefüllt ist. Obwohl die Tabelle mit Datensätzen gefüllt ist.

[EDIT]
Habe vergessen zu erwähnen das mein SQL-Query so aussah (Ich brauche ja alle Informationen der Tabelle):

ausblenden Quelltext
1:
select * from rdb$relation_fields where rdb$relation_name = 'tabelle1';					

[/EDIT]


kOOni
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Sa 07.01.06 23:45 
user profile icone86 hat folgendes geschrieben:

Ich zweifle deshalb etwas, weil alle Spalten mit "null" belegt sind und keine ausgefüllt ist. Obwohl die Tabelle mit Datensätzen gefüllt ist.

[EDIT]
Habe vergessen zu erwähnen das mein SQL-Query so aussah (Ich brauche ja alle Informationen der Tabelle):

ausblenden Quelltext
1:
select * from rdb$relation_fields where rdb$relation_name = 'tabelle1';					

[/EDIT]


kOOni

[delphi]
Mein Query zeigt natürlich nur die Felder von 'tabelle1' an und nicht alle der gesamten Datenbank. Willst du alle Felder Wissen mußt du eifach die where Bedingung weglassen.
Zitat:

Ich zweifle deshalb etwas, weil alle Spalten mit "null" belegt sind und keine ausgefüllt ist. Obwohl die Tabelle mit Datensätzen gefüllt ist.


In dieser Tabelle sind viele Felder NULL.
Versuchsa mal mit

select rdb$field_name from rdb$relation_fields

_________________
Markus Kinzler.


Zuletzt bearbeitet von mkinzler am Sa 07.01.06 23:54, insgesamt 2-mal bearbeitet
e86 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Windows XP SP2
C# (VS 2005 C# Express); Object Pascal (Delphi7 Prof.)
BeitragVerfasst: Sa 07.01.06 23:49 
Hallo,

mit deinem letzten Statement:

ausblenden SQL-Anweisung
1:
select rdb$field_name from rdb$relation_fields					


bekomme ich einfach eine Liste mit allen Tabellennamen. Das will ich ja nicht. Ich möchte alle Tabellennamen habe, welche NICHT vom System sondern von einem User erstellt wurden.

Dies habe ich ja schon erreicht.

Nun suche ich nur noch das Statement für das Abfragen von Informationen einer bestimmten Tabelle.


kOOni
ps.: Anbei, du hast hier glaub ich das ganze Design mit deinem Beitrag zerschmiessen :P ^^

Moderiert von user profile iconUGrohne: Code- durch SQL-Tags ersetzt
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Sa 07.01.06 23:59 
ausblenden SQL-Anweisung
1:
2:
select RDB$RELATION_NAME, rdb$field_name from rdb$relation_fields where NOT (RDB$RELATION_NAME LIKE 'IBE$%'AND NOT (RDB$RELATION_NAME LIKE 'RDB$%')
ORDER BY RDB$RELATION_NAME

zeigt dir eine Liste aller Felder an die Teil einer systemtabelle oder einer IBEasy+-Tabelle sind.

Moderiert von user profile iconUGrohne: Code- durch SQL-Tags ersetzt

_________________
Markus Kinzler.
e86 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Windows XP SP2
C# (VS 2005 C# Express); Object Pascal (Delphi7 Prof.)
BeitragVerfasst: So 08.01.06 00:08 
Ähm,

irgendwie reden wir einander vorbei. Was du mir bis jetzt geschickt hast, dass hab ich ja schon alles realisiert. :)

Ich möchte jetzt nur noch wissen,

- wie ich alle Informationen (Tabellentyp, Collation, Comment ...) einer BESTIMMTEN Tabelle abfragen kann und...

- ... wie ich mir alle Eigenschaften der Spalten einer BESTIMMTEN Tabelle zurückgeben lassen kann. Also der Datentyp, Name, Länge der Spalte bzw. der Spalten. Dabei ist auch, ob es eine PRIMARY KEY Spalte ist, ob sie NOT NULL sein darf etc...

Wie gesagt, ich brauche die Informationen zu den Tabellen und den deren Spalten. Nicht den NAMEN aller Tabellen (das hab ich ja schon) und keine Auflistung der SPALTENNAMEN ohne dazugehörige Informationen.


kOOni
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 08.01.06 00:33 
Wie gesagt befinden sich diese Informationen auf mehrere Systemtabellen verteilt.

Informationen zu den Constraints(PK, FK) befinden sich in der Tabelle rdb$relation_constraints), Informationen zu den Feldtypen kann über über das Feld rdb$field_source aus der Tabelle rdb&fileds geholt werden.

Zitat:
wie ich alle Informationen (Tabellentyp, Collation, Comment ...) einer BESTIMMTEN Tabelle abfragen kann und...

Was meinst du mit Tabellentyp?

ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
select
    f.RDB$RELATION_NAME, f.rdb$field_name,
    s.rdb$field_length
from
    rdb$relation_fields f, rdb$fields s
where
     NOT (RDB$RELATION_NAME LIKE 'IBE$%'AND NOT (RDB$RELATION_NAME LIKE 'RDB$%'and
     s.rdb$field_name = f.rdb$field_source
ORDER BY RDB$RELATION_NAME


Moderiert von user profile iconUGrohne: Code- durch SQL-Tags ersetzt

_________________
Markus Kinzler.
e86 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Windows XP SP2
C# (VS 2005 C# Express); Object Pascal (Delphi7 Prof.)
BeitragVerfasst: So 08.01.06 12:15 
Hallo,

danke für die Antwort. Jetzt weiß ich, auf was du hinaus willst. Dies scheint zu funktionieren. Nun habe ich den Namen und die Länge der Felder.

Hast du dafür irgendwie einen Link, wo eine Übersicht über diese Befehle ist?

Nachtrag:

Mit dem Tabellentyp meinte ich den Datentyp der Tabelle. Bin ich von MySQL her gewöhnt, da es dort bspw. MyISAM gibt. Aber den brauche ich nun nicht mehr.

kOOni
e86 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Windows XP SP2
C# (VS 2005 C# Express); Object Pascal (Delphi7 Prof.)
BeitragVerfasst: So 08.01.06 12:40 
Hallo,

ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
select
 f.rdb$field_name, s.RDB$Field_Length, s.RDB$field_type, s.RDB$description, 
 f.rdb$character_set_name
from
 rdb$relation_fields f, rdb$fields s
where
 NOT (RDB$RELATION_NAME LIKE 'IBE$%'AND NOT (RDB$RELATION_NAME LIKE 
 'RDB$%'and s.rdb$field_name = f.rdb$field_source


Dieses Statement bwirkt die Fehlermeldung:

ausblenden Quelltext
1:
Unbekannte Spalte: F					


Wiso? Es besteht doch die Spalte und der Field_Name "Character_Set_Name" ist doch auch vorhanden ... :?


kOOni
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: So 08.01.06 13:02 
user profile icone86 hat folgendes geschrieben:
Hallo,

ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
select
 f.rdb$field_name, s.RDB$Field_Length, s.RDB$field_type, s.RDB$description, 
 f.rdb$character_set_name
from
 rdb$relation_fields f, rdb$fields s
where
 NOT (RDB$RELATION_NAME LIKE 'IBE$%'AND NOT (RDB$RELATION_NAME LIKE 
 'RDB$%'and s.rdb$field_name = f.rdb$field_source


Dieses Statement bwirkt die Fehlermeldung:

ausblenden Quelltext
1:
Unbekannte Spalte: F					


Wiso? Es besteht doch die Spalte und der Field_Name "Character_Set_Name" ist doch auch vorhanden ... :?


kOOni

Nein die Tabelle rdb$relation_fields besitzt keinen Feld mit dem Namen.

Fehlermeldung IBExpert:

Column does not belong to referenced table.
Dynamic SQL Error.
SQL error code = -206.
Column unknown.
F.RDB$CHARACTER_SET_NAME.
At line 3, column 4.

In die Tabelle rdb%fileds hat einen Fremdschlüssel rdb$character_set_id auf die Tabelle rdb$character_sets.
ausblenden SQL-Anweisung
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
select
 f.rdb$field_name,
 s.RDB$Field_Length, s.RDB$field_type, s.RDB$description, 
 c.rdb$character_set_name
from
 rdb$relation_fields f, rdb$fields s , rdb$character_sets c
where
 NOT (RDB$RELATION_NAME LIKE 'IBE$%'AND NOT (RDB$RELATION_NAME LIKE 
 'RDB$%'and s.rdb$field_name = f.rdb$field_source and
 c.rdb$character_set_id = s.rdb$character_set_id;

_________________
Markus Kinzler.
e86 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18

Windows XP SP2
C# (VS 2005 C# Express); Object Pascal (Delphi7 Prof.)
BeitragVerfasst: So 08.01.06 15:02 
Hallo,

ich möchte mich erstmal für die Hilfe hier bedanken, besonders beim MKinzler!

Nun wäre ich fast fertig mit dem Statement. Was ich nun (endlich) habe ist:

- Spaltennamen
- Spaltentyp
- Null (ist es NULL oder NOT NULL)


Wegen dem Spaltentyp: Da steht eine Nummer. Ist das eine ID, welche ein Fremdschlüssel ist, der auf eine andere Tabelle verweist? Wie kann ich hierbei den 'richtigen' Datentyp alá CHAR oder INTEGER bspw. bestimmen?

Nun fehlt mir noch:

- Defaultwert
- PRIMARY KEY
- AUTO_INCREMENT

Ich habe aber keine entsprechenden Tabellen mit ähnlich klingenden Namen gefunden. :(

Anbei, wie war das nochmal, dass ich mir nur die Informationen der Spalten einer bestimmten Tabelle zurückgeben lasse? Hier geschieht dies ja für alle Tabellen, welche von Usern erstellt wurden.


kOOni