web-dev-qa-db-fra.com

SQL dynamique dans les routines stockées MySQL

Selon les restrictions sur les routines stockées et les déclencheurs , SQL dynamique ne peut pas être utilisé (restriction soulevée pour les procédures stockées dans la version 5.0.13 et ultérieure). Pourquoi cette limitation est-elle en place? Et pourquoi soulevez-le pour les procédures, mais pas des fonctions ou des déclencheurs?

13
Derek Downey

Il suffit d'entendre la question me fait penser à deux aspects:

Aspect n ° 1: Les fonctions sont censées être déterministes

Si tel est le cas, cela implique qu'une fonction doit présenter les mêmes données de retour systématiquement pour un ensemble donné de paramètres, peu importe lorsque vous appelez la fonction.

Maintenant, imaginez une fonction qui produit une réponse différente en raison de la collecte de données à différents moments de la journée en fonction de SQL statique dans la fonction. Dans un sens, cela peut toujours être considéré comme déterministe si vous interrogez le même ensemble de tables et de colonnes à chaque fois, étant donné le même ensemble de paramètres.

Et si vous pouviez modifier les tables sous-jacentes d'une fonction via Dynamic SQL? Vous violez la définition d'une fonction déterministe.

Notez que MySQL a ajouté cette option dans /etc/my.cnf

log-bin-trust-function-creators

Bien que cela puisse être une simplification excessive, cela permet d'autoriser les fonctions à écrire des données dans des journaux binaires sans appliquer strictement la propriété déterministe.

Aspect n ° 2: Les déclencheurs doivent pouvoir être ramassés

  • Pourriez-vous imaginer une gâchette avec tous les mêmes comportements que la fonction, puis en introduisant SQL dynamique dans le mélange?
  • Pourriez-vous imaginer essayer d'appliquer MVCC (contrôle de la concurrence multiversion) contre Dynamic SQL après avoir appliqué MVCC à la table de base que la gâchette était conçue?

Vous auriez essentiellement des données qui poussent quadratique (même de manière exponentielle) juste en MVCC seul. Le processus de gestion de la restauration de SQL avec des déclencheurs pouvant être non déterministes serait complexe impie, de dire le moins.

À la lumière de ces deux aspects, je suis sûr que les développeurs de MySQL ont pensé à ces choses et les ont rapidement rejetés en imposant des restrictions.

Alors, pourquoi soulever la restriction des procédures? Mettez simplement, il n'y a aucune inquiétude sur les propriétés déterministes ou la restauration.

8
RolandoMySQLDBA

C'est une excellente question, mais je ne connais pas la réponse. J'imagine que cela va avoir à aller à l'équipe des internaux, mais je ne sais pas qu'ils seront gros dans ce site. En attendant, je peux vous aider à déduire des réponses.

Pour commencer, je vois ceci:

Le cache de déclenchement ne détecte pas lorsque les métadonnées des objets sous-jacents ont changé. Si un déclencheur utilise une table et que la table a changé car la gâchette a été chargée dans le cache, la gâchette fonctionne à l'aide des métadonnées obsolètes.

Ce qui me fait penser que cela a quelque chose à voir avec ça. Cela ne va pas recompiler SQL si cela ne surveillait même pas les métadonnées. Ce qui signifie que c'est un problème de moteur.

Par la même jeton, quand j'ai lu ce bloc, je pense que la même chose (moteur):

Pour éviter les problèmes d'interaction entre les threads de serveur, lorsqu'un client émet une instruction, le serveur utilise un instantané de routines et de déclencheurs disponibles pour l'exécution de la déclaration. Autrement dit, le serveur calcule une liste des procédures, des fonctions et des déclencheurs pouvant être utilisés lors de l'exécution de la déclaration, les chargent, puis procédant à l'exécution de la déclaration. Cela signifie que si la déclaration s'exécute, elle ne verra pas les modifications apportées aux routines effectuées par d'autres threads.

Donc, dans tout ce que je ne suis pas totalement sûr, pourquoi ils ne le permettent pas, mais je peux deviner. Désolé que je ne puisse pas vous aider davantage, je suis ouvert à la victoire de plus. Le mieux est d'espérer que certains devs mysql actifs une fois que nous quittons la version bêta privée;)

5
jcolebrand

En grande partie, cela est dû à la sécurité. L'exception des procédures est que la SQL dynamique dans la procédure peut être attribuée au contexte de sécurité de l'utilisateur exécutant. Cela signifie que même si le moteur ne connaît pas quoi va être exécuté, il peut s'assurer que l'utilisateur est autorisé à accéder aux objets référencés.

Au-delà de cela, vous pouvez soulever les problèmes laids de ce qui pourrait arriver, était-ce permis.

1
dba4life