AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Firebird - Fremdschlüsselbeziehungen
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird - Fremdschlüsselbeziehungen

Ein Thema von Nico80 · begonnen am 5. Sep 2011 · letzter Beitrag vom 5. Sep 2011
Antwort Antwort
Nico80

Registriert seit: 28. Jun 2007
63 Beiträge
 
Delphi 2006 Enterprise
 
#1

Firebird - Fremdschlüsselbeziehungen

  Alt 5. Sep 2011, 14:14
Datenbank: Firebird • Version: 2.1 • Zugriff über: FIBPlus
Hallo zusammen,

ich suche ein SQL-Statement, dass mir zu einem beliebigen Primärschlüssel alle Fremdschlüsselbeziehungen (also Tabellennamen und Feldname) holt.
Hintergrund: Ich möchte die Verwendung ein bestimmten DS für den Benutzer anzeigen. Momentan stöbere ich jede mögliche Tabelle einzeln durch.
Gibt es die Möglichkeit über die Systemtabellen die Beziehungen auszulesen.

Danke für die Antworten und Tipps...
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Firebird - Fremdschlüsselbeziehungen

  Alt 5. Sep 2011, 14:32
Hallo,

Hab grad mal etwas gebastelt:

SQL-Code:
SELECT
  rdb$relation_constraints.rdb$relation_name as tabelle,
  rdb$index_segments.rdb$field_name as feld,
  rdb$relation_constraints.rdb$constraint_name as fk
FROM rdb$ref_constraints
JOIN rdb$relation_constraints on (rdb$relation_constraints.rdb$constraint_name = rdb$ref_constraints.rdb$constraint_name)
JOIN rdb$index_segments on (rdb$index_segments.rdb$index_name = rdb$relation_constraints.rdb$index_name)
WHERE (rdb$relation_constraints.rdb$constraint_type = "FOREIGN KEY")
  AND (rdb$ref_constraints.rdb$const_name_uq = "PK_IRGENDWAS")
Anstelle von "PK_IRGENDWAS" musst du den Namen des Primärschlüssels angeben (also Name des Constraints, nicht Name des Feldes!)
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Nico80

Registriert seit: 28. Jun 2007
63 Beiträge
 
Delphi 2006 Enterprise
 
#3

AW: Firebird - Fremdschlüsselbeziehungen

  Alt 5. Sep 2011, 14:51
Vielen Dank erstmal für die schnelle Antwort.

Ich möchte mir aber die tatsächlich existierenden Beziehungen (also auf Datenebene) anzeigen lassen.
Die Tabelle die du mir lieferst könnte ich aber als Grundlage nehmen,
um dynamisch alle Tabellen abzufragen, ob ein entsprechender DS "benutzt" wird.

Aber vielleicht gibt es ja noch andere Möglichkeiten...
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Firebird - Fremdschlüsselbeziehungen

  Alt 5. Sep 2011, 16:03
Hi,

ich habe mir eine Procedure geschrieben, welche die tabellen und Anzahl der Datensätze liefert.
Sicher nicht genau das, was du brauchst. Aber vielleicht hilft es ja:

Code:
create or alter procedure sys$to_delete (
    table_name varchar(31),
    id integer)
returns (
    relation_name varchar(31),
    anzahl integer,
    can_delete char(1))
as
declare variable field_name varchar(31);
begin
  /*
    -> zum Anzeigen vor dem Löschen
    Alle abhängigen Tabellennamen mit Anzahl der Datensätze
    welche mit gelöscht werden, wenn Record mit ID :id der Tabelle :table_name
    gelöscht wird
  */
  for select
    A.RDB$RELATION_NAME
  , E.RDB$FIELD_NAME
  , case
      when B.RDB$DELETE_RULE = 'CASCADE' then
        'T'
      else
        'F'
    end
    from RDB$REF_CONSTRAINTS B, RDB$RELATION_CONSTRAINTS A, RDB$RELATION_CONSTRAINTS C,
         RDB$INDEX_SEGMENTS D, RDB$INDEX_SEGMENTS E
    where (A.RDB$CONSTRAINT_TYPE = 'FOREIGN KEY') and
          (A.RDB$CONSTRAINT_NAME = B.RDB$CONSTRAINT_NAME) and
          (B.RDB$CONST_NAME_UQ=C.RDB$CONSTRAINT_NAME) and
          (C.RDB$INDEX_NAME=D.RDB$INDEX_NAME) and
          (A.RDB$INDEX_NAME=E.RDB$INDEX_NAME) and
          (C.RDB$RELATION_NAME = :table_name) and
          (B.RDB$DELETE_RULE in ('CASCADE', 'RESTRICT'))
    into
    :relation_name
  , :field_name
  , :can_delete do
  begin
    execute statement 'select count(*) from '||:relation_name||' where '||:field_name||
                      '='||:id
                      into :anzahl;
    suspend;
  end
end
In diesem Fall übergebe ich den Tabellennamen und den PK (ID).

Frank
Frank Reim
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es 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

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:50 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz