FirebirdSQL logo

Das Feld RDB$VALID_BLR

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.

Note

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, das aufgrund einer Inkompatibilität aufgrund einer Domänenänderung nicht neu kompiliert werden kann, wird als ungültig markiert (“invalidated” durch Setzen von RDB$VALID_BLR in seinem System Record (in RDB$PROCEDURES oder RDB$TRIGGERS , wie zutreffend) auf Null.

Eine erneute Validierung (Einstellung von RDB$VALID_BLR auf 1) erfolgt, wenn

  1. die Domäne wird erneut geändert und die neue Definition ist mit der zuvor ungültig gemachten Moduldefinition kompatibel; ODER

  2. das zuvor ungültig gemachte Modul wird geändert, um der neuen Domänendefinition zu entsprechen

Die folgende Abfrage findet die Module, die von einer bestimmten Domäne abhängen und meldet den Status ihrer RDB$VALID_BLR-Felder:

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')
Important

Alle durch Domänen-/Spaltenänderungen verursachten PSQL-Ungültigkeiten werden im Feld RDB$VALID_BLR wiedergegeben.Andere Arten von Änderungen, wie die Anzahl der Eingabe- oder Ausgabeparameter, aufgerufene Routinen usw., wirken sich jedoch nicht auf das Validierungsfeld aus, obwohl sie das Modul möglicherweise ungültig machen.Ein typisches solches Szenario könnte eines der folgenden sein:

  1. Es wird eine Prozedur (B) definiert, die eine andere Prozedur (A) aufruft und daraus Ausgabeparameter liest.In diesem Fall wird eine Abhängigkeit in RDB$DEPENDENCIES registriert.Anschließend wird die aufgerufene Prozedur (A) geändert, um einen oder mehrere dieser Ausgabeparameter zu ändern oder zu entfernen.Die Anweisung ALTER PROCEDURE A schlägt mit einem Fehler fehl, wenn ein Commit versucht wird.

  2. Eine Prozedur (B) ruft Prozedur A auf und liefert Werte für ihre Eingabeparameter.In RDB$DEPENDENCIES ist keine Abhängigkeit registriert.Eine nachträgliche Änderung der Eingabeparameter in Prozedur A ist zulässig.Ein Fehler tritt zur Laufzeit auf, wenn B A mit dem nicht übereinstimmenden Eingabeparametersatz aufruft.

Note
Weitere Hinweise
  • 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.

Ein Hinweis zur Gleichheit

Important

Diese Anmerkung über Gleichheits- und Ungleichheits-Operatoren gilt überall in der Firebird SQL-Sprache.

Der “=”-Operator, welcher ausdrücklich in vielen Bedingungen verwendet wird, prüft nur Werte gegen Werte.Entsprechend dem SQL-Standard, ist NULL kein Wert und somit sind zwei NULLs weder gleich noch ungleich zueinander.Wenn Sie NULLs in Bedingungen vergleichen müssen, nutzen Sie den Operator IS NOT DISTINCT FROM.Dieser gibt wahr zurück, falls die Operanden den gleichen Wert besitzen oder beide NULL sind.

select *
  from A join B
  on A.id is not distinct from B.code

In Fällen in denen Sie gegen NULL innerhalb einer ungleich-Bedingung testen wollen, nutzen Sie IS DISTINCT FROM, nicht “<>”.Möchten Sie NULL unterschiedlich zu anderen Werten und zwei NULLs als gleich betrachten:

select *
  from A join B
  on A.id is distinct from B.code

docnext count = 0