Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Firebird - Fremdschlüsselbeziehungen (https://www.delphipraxis.net/162782-firebird-fremdschluesselbeziehungen.html)

Nico80 5. Sep 2011 14:14

Datenbank: Firebird • Version: 2.1 • Zugriff über: FIBPlus

Firebird - Fremdschlüsselbeziehungen
 
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...

Neutral General 5. Sep 2011 14:32

AW: Firebird - Fremdschlüsselbeziehungen
 
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!)

Nico80 5. Sep 2011 14:51

AW: Firebird - Fremdschlüsselbeziehungen
 
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...

dataspider 5. Sep 2011 16:03

AW: Firebird - Fremdschlüsselbeziehungen
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:18 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