Lorsque
l’on veut passer à une nouvelle version de UDF FreeAdhoc, on a
souvent
à faire face aux dépendances fonctionnelles qui existent dans une
base
de données (utilisées dans les champs ComputedBy, les déclencheurs
(triggers), les vues ou les procédures stoquées) et qui empêchent la
suppression d’une fonction. Jusqu’à InterBase 6, il était possible
de
supprimer les dépendances.
Il y a cependant un moyen de contourner cette difficulté par la
procédure suivante qui n’est certes pas très normale, mais qui peut
cependant être utilisée sans risque.
/* UDF (Elle concerne toutes les fonctions) */
Version pour InterBase
UPDATE RDB$DEPENDENCIES SET RDB$DEPENDED_ON_NAME = 'xyz' ||
RDB$DEPENDED_ON_NAME
WHERE RDB$DEPENDED_ON_TYPE = 14;
Version pour FireBird
UPDATE RDB$DEPENDENCIES SET RDB$DEPENDED_ON_NAME = 'xyz' ||
RDB$DEPENDED_ON_NAME
WHERE RDB$DEPENDED_ON_TYPE = 15;
/* Éliminer alors les fonctions
UDF */
DROP EXTERNAL FUNCTION F_.....;
DROP EXTERNAL FUNCTION F_.....;
...
/* Installer maintenant les nouvelles fonctions UDF FreeAdhoc
au moyen de leur script */
...
/* Puis rétablir les dépendances fonctionnelles antérieures */
Version pour 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 pour 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';
Remarque:
Dans les versions 6.0 et antérieures de InterBase, la table
RDB$DEPENDENCIES n’existait pas et par conséquent les dépendances
fonctionnelles n’étaient pas enregistrées. À partir de InterBase 6.5
et
de FireBird 1.5, toutes les dépendances fonctionnelles sont reprises
dans la table RDB$DEPENDENCIES.
Le script suivant permet de visualiser les dépendances
fonctionnelles d’une base de données.
Version pour InterBase à partir de
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 pour FireBird à partir de 2.0
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
On remarque la différence dans les ‹TYPE› après 10 :
- 11 : GENERATOR dans InterBase ; pas utilisé en FireBird
- 14 : UDF dans InterBase ; GENERATOR dans FireBird
- 15 : pas utilisé en InterBase ; UDF dans FireBird. |