![]() |
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... |
AW: Firebird - Fremdschlüsselbeziehungen
Hallo,
Hab grad mal etwas gebastelt:
SQL-Code:
Anstelle von "PK_IRGENDWAS" musst du den Namen des Primärschlüssels angeben (also Name des Constraints, nicht Name des Feldes!)
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") |
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... |
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:
In diesem Fall übergebe ich den Tabellennamen und den PK (ID).
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 Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz