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 |