FirebirdSQL logo
 PROCEDUREPACKAGE 

Fonctions déterministes

La clause facultative DETERMINISTIC indique que la fonction est déterministe. Les fonctions déterministes renvoient le même résultat à chaque fois si on leur donne le même ensemble de valeurs d’entrée. Les fonctions non déterministes peuvent renvoyer des résultats différents à chaque fois, même si on leur donne le même ensemble de valeurs d’entrée. Si une fonction est dite déterministe, elle n’est pas recalculée si elle a déjà été calculée une fois avec l’ensemble donné d’arguments d’entrée, mais elle prend ses valeurs du cache

Note

En fait, dans la version actuelle de Firebird, il n’y a pas de cache de fonctions stockées avec des arguments d’entrée mis en correspondance avec des valeurs de sortie.

Spécifier une instruction DETERMINISTIC est en fait une sorte de promesse que le code de la fonction retournera la même chose. A ce stade, une fonction déterministe est considérée comme un invariant et fonctionne sur les mêmes principes que les autres invariants. C’est-à-dire qu’elle est calculée et mise en cache au niveau d’exécution actuel de cette requête.

Cet exemple le démontre aisément :

CREATE FUNCTION FN_T
RETURNS DOUBLE PRECISION DETERMINISTIC
AS
BEGIN
  RETURN rand();
END

-- la fonction sera calculée deux fois et retournera 2 valeurs différentes
SELECT fn_t() FROM rdb$database
UNION ALL
SELECT fn_t() FROM rdb$database

-- la fonction sera calculée une fois et retournera 2 valeurs identiques
WITH t(n) AS (
  SELECT 1 FROM rdb$database
  UNION ALL
  SELECT 2 FROM rdb$database
)
SELECT n, fn_t() FROM t

Privilèges d’exécution

La clause facultative SQL SECURITY vous permet de spécifier avec quels privilèges la fonction stockée est exécutée. Si l’option INVOKER est sélectionnée, la fonction stockée est exécutée avec les privilèges de l’utilisateur appelant. Si l’option DEFINER est sélectionnée, la fonction stockée est exécutée avec les privilèges de l’utilisateur définissant (propriétaire de la fonction). Ces privilèges s’ajouteront aux privilèges accordés à la fonction stockée elle-même à l’aide de l’opérateur GRANT. Par défaut, la fonction stockée est exécutée avec les privilèges de l’utilisateur appelant.

Tip

Les privilèges d’exécution par défaut pour les objets de métadonnées nouvellement créés peuvent être modifiés à l’aide de la commande

ALTER DATABASE SET DEFAULT SQL SECURITY {DEFINER | INVOKER}