FreeAdhocUDF für InterBase und FireBird in deutschin englishen français
homeprevious pagecontentnext pagelast page Mailing-Liste • mailinglist • liste de diffusionwas ich vermisse • what I missed •eMail Kommentar • eMail commentprint
Möglichkeit, UDFs auszutauschen TROTZ Abhängigkeiten

Wenn man auf die FreeAdhocUDF wechseln möchte ergibt sich häufig die Problematik, dass sich die vorhandenen gleichlautenden UDFs wegen Abhängigkeiten (sie werden in ComputedBy-Felder, Triggern, Views oder Proceduren verwendet) nicht löschen lassen (bis InterBase 6 ging dies).
Dafür gibt es einen (nicht ganz sauberen aber ungefährlichen) Trick:
/* UDF-Abhängigkeiten vorübergehend ausschalten */
Version für InterBase
UPDATE RDB$DEPENDENCIES SET RDB$DEPENDED_ON_NAME = 'xyz' || RDB$DEPENDED_ON_NAME
WHERE RDB$DEPENDED_ON_TYPE = 14;
Version für FireBird
UPDATE RDB$DEPENDENCIES SET RDB$DEPENDED_ON_NAME = 'xyz' || RDB$DEPENDED_ON_NAME
WHERE RDB$DEPENDED_ON_TYPE = 15;
/* UDF-Funktionen nun entfernen */
DROP  EXTERNAL FUNCTION .....;
DROP  EXTERNAL FUNCTION .....;
...
/* jetzt FreeAdhocUDF Funktionen über deren Script hinzufügen */
...
/* dann die (alten) Abhängigkeiten wiederherstellen */
Version für InterBase
UPDATE RDB$DEPENDENCIES
SET RDB$DEPENDED_ON_NAME = F_REPLACESTRING(RDB$DEPENDED_ON_NAME, 'xyz', '', 0, 0)
WHERE RDB$DEPENDED_ON_TYPE = 14 AND RDB$DEPENDED_ON_NAME STARTING WITH 'xyz';   
Version für FireBird
UPDATE RDB$DEPENDENCIES
SET RDB$DEPENDED_ON_NAME = F_REPLACESTRING(RDB$DEPENDED_ON_NAME, 'xyz', '', 0, 0)
WHERE RDB$DEPENDED_ON_TYPE = 15 AND RDB$DEPENDED_ON_NAME STARTING WITH 'xyz';   

Anmerkung:
In InterBase 6.0 und früher gab es die Tabelle RDB$DEPENDENCIES nicht - und folglich auch keine protokollierten Abhängigkeiten. Seit InterBase 6.5 und FireBird 1.5 werden alle Abhängigkeiten in der Tabelle RDB$DEPENDENCIES vermerkt.
Mit folgendem Script bekommt man einen Überblick über die Abhängigkeiten in seiner Datenbank:
Version für InterBase ab 7.5
SELECT RDB$DEPENDENT_NAME AS DEPENDENT_NAME,
  RDB$DEPENDED_ON_NAME AS DEPENDS_ON,
  RDB$FIELD_NAME AS FIELD_NAME,
  RDB$DEPENDENT_TYPE DEPENDENT_TYPE,
    CASE
      WHEN RDB$DEPENDENT_TYPE = 0 THEN 'TABLE'
      WHEN RDB$DEPENDENT_TYPE = 1 THEN 'VIEW'
      WHEN RDB$DEPENDENT_TYPE = 2 THEN 'TRIGGER'
      WHEN RDB$DEPENDENT_TYPE = 3 THEN 'COMPUTED'
      WHEN RDB$DEPENDENT_TYPE = 4 THEN 'VALIDATION'
      WHEN RDB$DEPENDENT_TYPE = 5 THEN 'PROCEDURE'
      WHEN RDB$DEPENDENT_TYPE = 6 THEN 'EXPRESSION_INDEX'
      WHEN RDB$DEPENDENT_TYPE = 7 THEN 'EXCEPTION'
      WHEN RDB$DEPENDENT_TYPE = 8 THEN 'USER'
      WHEN RDB$DEPENDENT_TYPE = 9 THEN 'FIELD'
      WHEN RDB$DEPENDENT_TYPE = 10 THEN 'INDEX'
      WHEN RDB$DEPENDENT_TYPE = 11 THEN 'GENERATOR'
      WHEN RDB$DEPENDENT_TYPE = 14 THEN 'UDF'
      ELSE 'UNKNOWN'
      END AS DEPENDENT_TYPE_STR,
    RDB$DEPENDED_ON_TYPE AS DEPEND_ON_TYPE,
    CASE
      WHEN RDB$DEPENDED_ON_TYPE = 0 THEN 'TABLE'
      WHEN RDB$DEPENDED_ON_TYPE = 1 THEN 'VIEW'
      WHEN RDB$DEPENDED_ON_TYPE = 2 THEN 'TRIGGER'
      WHEN RDB$DEPENDED_ON_TYPE = 3 THEN 'COMPUTED'
      WHEN RDB$DEPENDED_ON_TYPE = 4 THEN 'VALIDATION'
      WHEN RDB$DEPENDED_ON_TYPE = 5 THEN 'PROCEDURE'
      WHEN RDB$DEPENDED_ON_TYPE = 6 THEN 'EXPRESSION_INDEX'
      WHEN RDB$DEPENDED_ON_TYPE = 7 THEN 'EXCEPTION'
      WHEN RDB$DEPENDED_ON_TYPE = 8 THEN 'USER'
      WHEN RDB$DEPENDED_ON_TYPE = 9 THEN 'FIELD'
      WHEN RDB$DEPENDED_ON_TYPE = 10 THEN 'INDEX'
      WHEN RDB$DEPENDED_ON_TYPE = 11 THEN 'GENERATOR'
      WHEN RDB$DEPENDED_ON_TYPE = 14 THEN 'UDF'
      ELSE 'UNKNOWN'
      END AS DEPENDS_ON_TYPE_STR
FROM RDB$DEPENDENCIES
ORDER BY RDB$DEPENDENT_NAME
Version für FireBird
SELECT RDB$DEPENDENT_NAME AS DEPENDENT_NAME,
  RDB$DEPENDED_ON_NAME AS DEPENDS_ON,
  RDB$FIELD_NAME AS FIELD_NAME,
  RDB$DEPENDENT_TYPE DEPENDENT_TYPE,
    CASE
      WHEN RDB$DEPENDENT_TYPE = 0 THEN 'TABLE'
      WHEN RDB$DEPENDENT_TYPE = 1 THEN 'VIEW'
      WHEN RDB$DEPENDENT_TYPE = 2 THEN 'TRIGGER'
      WHEN RDB$DEPENDENT_TYPE = 3 THEN 'COMPUTED'
      WHEN RDB$DEPENDENT_TYPE = 4 THEN 'VALIDATION'
      WHEN RDB$DEPENDENT_TYPE = 5 THEN 'PROCEDURE'
      WHEN RDB$DEPENDENT_TYPE = 6 THEN 'EXPRESSION_INDEX'
      WHEN RDB$DEPENDENT_TYPE = 7 THEN 'EXCEPTION'
      WHEN RDB$DEPENDENT_TYPE = 8 THEN 'USER'
      WHEN RDB$DEPENDENT_TYPE = 9 THEN 'FIELD'
      WHEN RDB$DEPENDENT_TYPE = 10 THEN 'INDEX'
      WHEN RDB$DEPENDENT_TYPE = 14 THEN 'GENERATOR'
      WHEN RDB$DEPENDENT_TYPE = 15 THEN 'UDF'
      ELSE 'UNKNOWN'
      END AS DEPENDENT_TYPE_STR,
    RDB$DEPENDED_ON_TYPE AS DEPEND_ON_TYPE,
    CASE
      WHEN RDB$DEPENDED_ON_TYPE = 0 THEN 'TABLE'
      WHEN RDB$DEPENDED_ON_TYPE = 1 THEN 'VIEW'
      WHEN RDB$DEPENDED_ON_TYPE = 2 THEN 'TRIGGER'
      WHEN RDB$DEPENDED_ON_TYPE = 3 THEN 'COMPUTED'
      WHEN RDB$DEPENDED_ON_TYPE = 4 THEN 'VALIDATION'
      WHEN RDB$DEPENDED_ON_TYPE = 5 THEN 'PROCEDURE'
      WHEN RDB$DEPENDED_ON_TYPE = 6 THEN 'EXPRESSION_INDEX'
      WHEN RDB$DEPENDED_ON_TYPE = 7 THEN 'EXCEPTION'
      WHEN RDB$DEPENDED_ON_TYPE = 8 THEN 'USER'
      WHEN RDB$DEPENDED_ON_TYPE = 9 THEN 'FIELD'
      WHEN RDB$DEPENDED_ON_TYPE = 10 THEN 'INDEX'
      WHEN RDB$DEPENDED_ON_TYPE = 14 THEN 'GENERATOR'
      WHEN RDB$DEPENDED_ON_TYPE = 15 THEN 'UDF'
      ELSE 'UNKNOWN'
      END AS DEPENDS_ON_TYPE_STR
FROM RDB$DEPENDENCIES
ORDER BY RDB$DEPENDENT_NAME

Man sieht den Unterschied in den Typen ab 10:
- in InterBase ist 11 GENERATOR - in FireBird ist 11 nicht belegt
- in InterBase ist 14 UDF - in FireBird ist 14 GENERATOR
- in InterBase ist 15 nicht belegt - in FireBird ist 15 UDF
nach oben • go top • vers le hautnächste Seite • next page • prochain site