Auslesen FB-System-Tabellen "zugeordnete Domain"

Themen rund um den praktischen Einsatz von Firebird. Fragen zu SQL, Performance, Datenbankstrukturen, etc.

Moderator: thorben.braun

Antworten
Hamburgo
Beiträge: 125
Registriert: Di 28. Mai 2019, 17:28

Hallo zusammen,

kann mir jemand folgenden SELECT dahingehend ergänzen, dass dieser mir auch den
Namen der einem Feld zugeordneten Domain mitliefert ?

Code: Alles auswählen

                 $Select = "SELECT r.RDB\$FIELD_NAME AS field_name,
                                  r.RDB\$DESCRIPTION AS field_description,
                                  r.RDB\$DEFAULT_VALUE AS field_default_value,
                                  r.RDB\$NULL_FLAG AS field_not_null_constraint,
                                  f.RDB\$FIELD_LENGTH AS field_length,
                                  f.RDB\$FIELD_PRECISION AS field_precision,
                                  f.RDB\$FIELD_SCALE AS field_scale,
                                  CASE f.RDB\$FIELD_TYPE
                                  WHEN 261 THEN 'BLOB'
                                  WHEN 14 THEN 'CHAR'
                                  WHEN 40 THEN 'CSTRING'
                                  WHEN 11 THEN 'D_FLOAT'
                                  WHEN 27 THEN 'DOUBLE'
                                  WHEN 10 THEN 'FLOAT'
                                  WHEN 16 THEN 'INT64'
                                  WHEN 8 THEN 'INTEGER'
                                  WHEN 9 THEN 'QUAD'
                                  WHEN 7 THEN 'SMALLINT'
                                  WHEN 12 THEN 'DATE'
                                  WHEN 13 THEN 'TIME'
                                  WHEN 35 THEN 'TIMESTAMP'
                                  WHEN 37 THEN 'VARCHAR'
                                  ELSE 'UNKNOWN'
                                  END AS field_type,
                                  f.RDB\$FIELD_SUB_TYPE AS field_subtype,
                                  coll.RDB\$COLLATION_NAME AS field_collation,
                                  cset.RDB\$CHARACTER_SET_NAME AS field_charset
                                  FROM RDB\$RELATION_FIELDS r
                                  LEFT JOIN RDB\$FIELDS f ON r.RDB\$FIELD_SOURCE = f.RDB\$FIELD_NAME
                                  LEFT JOIN RDB\$COLLATIONS coll ON f.RDB\$COLLATION_ID = coll.RDB\$COLLATION_ID
                                  LEFT JOIN RDB\$CHARACTER_SETS cset ON f.RDB\$CHARACTER_SET_ID = cset.RDB\$CHARACTER_SET_ID
                                  WHERE r.RDB\$RELATION_NAME='".$Name."' 
                                  ORDER BY r.RDB\$FIELD_POSITION
                          ";
Herzlichen Dank
Benutzeravatar
martin.koeditz
Beiträge: 443
Registriert: Sa 31. Mär 2018, 14:35

Hi,

die Domain-Namen stehen im Feld RDB$FIELD_NAME.

Code: Alles auswählen

SELECT r.RDB$FIELD_NAME AS field_name,
                                  r.RDB$DESCRIPTION AS field_description,
                                  r.RDB$DEFAULT_VALUE AS field_default_value,
                                  r.RDB$NULL_FLAG AS field_not_null_constraint,
                                  f.RDB$FIELD_LENGTH AS field_length,
                                  f.RDB$FIELD_PRECISION AS field_precision,
                                  f.RDB$FIELD_SCALE AS field_scale,       
                                  f.RDB$FIELD_NAME as domain_name,
                                  CASE f.RDB$FIELD_TYPE
                                  WHEN 261 THEN 'BLOB'
                                  WHEN 14 THEN 'CHAR'
                                  WHEN 40 THEN 'CSTRING'
                                  WHEN 11 THEN 'D_FLOAT'
                                  WHEN 27 THEN 'DOUBLE'
                                  WHEN 10 THEN 'FLOAT'
                                  WHEN 16 THEN 'INT64'
                                  WHEN 8 THEN 'INTEGER'
                                  WHEN 9 THEN 'QUAD'
                                  WHEN 7 THEN 'SMALLINT'
                                  WHEN 12 THEN 'DATE'
                                  WHEN 13 THEN 'TIME'
                                  WHEN 35 THEN 'TIMESTAMP'
                                  WHEN 37 THEN 'VARCHAR'
                                  ELSE 'UNKNOWN'
                                  END AS field_type,
                                  f.RDB$FIELD_SUB_TYPE AS field_subtype,
                                  coll.RDB$COLLATION_NAME AS field_collation,
                                  cset.RDB$CHARACTER_SET_NAME AS field_charset
                                  FROM RDB$RELATION_FIELDS r
                                  LEFT JOIN RDB$FIELDS f ON r.RDB$FIELD_SOURCE = f.RDB$FIELD_NAME
                                  LEFT JOIN RDB$COLLATIONS coll ON f.RDB$COLLATION_ID = coll.RDB$COLLATION_ID
                                  LEFT JOIN RDB$CHARACTER_SETS cset ON f.RDB$CHARACTER_SET_ID = cset.RDB$CHARACTER_SET_ID
                                  --WHERE r.RDB$RELATION_NAME='".$Name."' 
                                  ORDER BY r.RDB$FIELD_POSITION
Gruß
Martin
Martin Köditz
it & synergy GmbH
Hamburgo
Beiträge: 125
Registriert: Di 28. Mai 2019, 17:28

Hallo Martin,

vielen Dank für den Tipp, aber ich glaube, dass Du mich falsch verstanden hast.

Den obigen Select habe ich mal aus einem Forum geholt und ich habe keine Ahnung
warum so aufgebaut ist, weil hierfür meine Kenntnisse einfach zu mangelhaft sind.

Er liefert mir alle Informationen zu meinen Tabellen, die bisher brauchte, mit Ausnahme
des Namens einer evtl. zugeordneten Domain.

Mein Know-How reicht ebenfalls nicht dafür aus, in diesem Select irgend etwas zu ändern.

Meine Hoffnung ist, dass irgendeiner von Eurch Spezialisten diesen Select so ergänzen
kann, dass er mir zusätzlich auch den Domain-Namen liefert, wenn eine einem Feld zugeordnet ist.

Eine solche Änderung habe ich in Deiner Antwort nicht ausfindig machen können.

Oder habe ich da etwas übersehen ?
bfuerchau
Beiträge: 485
Registriert: Mo 7. Mai 2018, 18:09
Kontaktdaten:

FIELD_NAME = Feldname
DOMAIN_NAME = Domain

In o.a. Beispiel kannst du die Where-Klausel mit deinem Tabellennamen verwenden.
Übrigens:
Die kostenlose PE-Version von IBExpert funktioniert immer noch sehr gut und liefert viele Erkenntnisse, auch mit FB3.0.

https://www.ibexpert.net/ibe_de/pmwiki. ... nalEdition

Wenn man sich damit die Feldliste einer Tabelle ansieht, sieht man auch die Domainnamen (die gibts nämlich grundsätzlich) und kann sie da auch in gewissem Rahmen anppassen, z.B. CHAR(5) => CHAR(10), VARCHAR(N) => VARCHAR(N+100).
Durch die Satzkomprimierung bedarfs da noch nicht mal ein Umkopieren.
Antworten