Einzelnen Beitrag anzeigen

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