Firebird Documentation IndexFirebird 2.5 SprachreferenzZusatzinformationen → Das Feld RDB$VALID_BLR
Firebird Home Firebird Home Zurück: ZusatzinformationenFirebird Documentation IndexNach oben: ZusatzinformationenWeiter: Ein Hinweis zur Gleichheit

Das Feld RDB$VALID_BLR

Inhaltsverzeichnis

Funktionsweise der Invalidierung

Das Feld RDB$VALID_BLR wurde zu den Systemtabellen RDB$PROCEDURES und RDB$TRIGGERS in Firebird 2.1 hinzugefügt. Sein Zweck ist, eine mögliche Ungültigkeit eines PSQL-Moduls nach einer Änderung einer Domäne oder Tabellenspalte, von der das Modul abhängt, zu signalisieren.RDB$VALID_BLR wird auf 0 gesetzt, sobald der Code einer Prozedur oder eines Triggers ungültig durch eine solche Änderung wird.

Funktionsweise der Invalidierung

Bei Triggern und Prozeduren ergeben sich Abhängigkeiten durch die Definitionen der Tabellenspalten, auf die zugegriffen wird, und auch über alle Parameter oder Variablen, die im Modul mit der TYPE OF-Klausel definiert wurden.

Nachdem die Engine jede Domain, einschließlich der impliziten Domains, die intern hinter den Spaltendefinitionen und den Ausgabeparametern erstellt wurden, geändert hat, werden alle ihre Abhängigkeiten intern neu kompiliert.

Anmerkung

In V.2.x beinhaltet dies Prozeduren und Trigger, jedoch keine Blöcke, die in DML-Anweisungen für die Laufzeitausführung mit EXECUTE BLOCK codiert sind. Firebird 3 umfasst weitere Modultypen (gespeicherte Funktionen, Pakete).

Jedes Modul, dass nicht neukompiliert werden kann, aufgrund einer Inkompatibilität durch eine Änderung einer Domain, wird als ungültig markiert („invalidated“). Dies geschieht durch Setzen von RDB$VALID_BLR im Systemdatensatz (in RDB$PROCEDURES oder RDB$TRIGGERS) auf 0.

Revalidierung (setzen von RDB$VALID_BLR auf 1) tritt auf, wenn

  1. die Domain erneut geändert wird und die neue Definition kompatibel zur vorigen invalidierten Moduldefinition ist; ODER
  2. das vorige invalidierte Modul angepasst wurde um zur neuen Domain-Definition zu passen

Die folgende Abfrage zeigt alle Module an, die von einer bestimmten Domain abhängig sind, und gibt deren RDB$VALID_BLR-Status aus:

SELECT * FROM (
  SELECT
    'Procedure',
    rdb$procedure_name,
    rdb$valid_blr
  FROM rdb$procedures
  UNION ALL
  SELECT
    'Trigger',
    rdb$trigger_name,
    rdb$valid_blr
  FROM rdb$triggers
) (type, name, valid)
WHERE EXISTS
  (SELECT * from rdb$dependencies
   WHERE rdb$dependent_name = name
     AND rdb$depended_on_name = 'MYDOMAIN')

/* Replace MYDOMAIN with the actual domain name.
   Use all-caps if the domain was created
   case-insensitively. Otherwise, use the exact
   capitalisation. */
      

Die folgende Abfrage zeigt alle Module an, die von einer bestimmten Tabellenspalte abhängig sind, und gibt deren RDB$VALID_BLR-Status aus:

SELECT * FROM (
  SELECT
    'Procedure',
    rdb$procedure_name,
    rdb$valid_blr
  FROM rdb$procedures
  UNION ALL
  SELECT
    'Trigger',
    rdb$trigger_name,
    rdb$valid_blr
  FROM rdb$triggers) (type, name, valid)
WHERE EXISTS
  (SELECT *
   FROM rdb$dependencies
   WHERE rdb$dependent_name = name
     AND rdb$depended_on_name = 'MYTABLE'
     AND rdb$field_name = 'MYCOLUMN')
      

Wichtig

Alle PSQL-Invalidierungen die durch Änderungen einer Domain oder Spalte verursacht werden, spiegeln sich im RDB$VALID_BLR-Feld wieder. Jedoch beeinflussen andere Änderungen, wie beispielsweise die Anzahl der Ein- und Ausgabeparameter, aufgerufene Routinen usw. die Gültigkeitsfelder nicht, obwohl sie die Module potenziell invalidieren. Ein typisches Szenario ist folgendes:

  1. Eine Prozedur (B) wird definiert, diese ruft eine andere Prozedur (A) auf und liest ihre Ausgabeparameter. In diesem Fall wird die Abhängigkeit in RDB$DEPENDENCIES registriert. Danach wird Prozedur (A) angepasst. Es werden ein oder mehr Ausgabeparameter angepasst oder entfernt. Das Statement ALTER PROCEDURE A wird mit einem Fehler quittiert, sobald versucht wird ein Commit durchzuführen.
  2. Eine Prozedur (B) ruft Prozedur A auf und übergibt Werte für die Eingabeparameter. Keine Abhängigkeiten werden in RDB$DEPENDENCIES registriert. Danach werden Änderungen an den Eingabeparametern in Prozedur A durchgeführt. Fehler werden zur Laufzeit auftreten, wenn B A aufruft und es nicht-passende Eingabeparemeter übergeben werden.

Weitere Hinweise Notes

  • Für PSQL-Module aus früheren Firebird-Versionen (gilt für einige Systemtrigger, sogar wenn die Datenbank unter Firebird 2.1. oder höher erstellt wurde), ist RDB$VALID_BLR NULL. Dies heißt nicht, dass ihre BLR ungültig ist.
  • Die isql-Befehle SHOW PROCEDURES und SHOW TRIGGERS zeigen ein Sternchen in der RDB$VALID_BLR-Spalte für alle Module, deren Wert 0 ist (ungültig). Für SHOW PROCEDURE <procname> und SHOW TRIGGER <trigname>, welche einzelne PSQL-Module sind, werden gar keien ungültigen BLR signalisiert.
Zurück: ZusatzinformationenFirebird Documentation IndexNach oben: ZusatzinformationenWeiter: Ein Hinweis zur Gleichheit
Firebird Documentation IndexFirebird 2.5 SprachreferenzZusatzinformationen → Das Feld RDB$VALID_BLR