Frage

Laut dem Einschränkungen für gespeicherte Routinen und Auslöser, Dynamisches SQL kann nicht verwendet werden (Einschränkung für gespeicherte Prozeduren in Version 5.0.13 und später). Warum ist diese Einschränkung vorhanden? Und warum es für Verfahren heben, aber keine Funktionen oder Auslöser?

War es hilfreich?

Lösung

Wenn ich die Frage nur hörte, denke ich an zwei Aspekte:

Aspekt Nr. 1: Funktionen sollen deterministisch sein

Dies bedeutet dies, dass eine Funktion für einen bestimmten Parametersatz die gleichen Rückgabedaten konsistent darstellen sollte, unabhängig davon, ob Sie die Funktion aufrufen.

Stellen Sie sich nun eine Funktion vor, die eine andere Antwort erzeugt, da Daten zu verschiedenen Tageszeiten gesammelt werden, die auf statischen SQL in der Funktion basieren. In gewissem Sinne kann dies immer noch als deterministisch angesehen werden, wenn Sie jedes Mal den gleichen Satz von Tabellen und Spalten abfragen, wenn Sie denselben Satz von Parametern haben.

Was wäre, wenn Sie die zugrunde liegenden Tabellen einer Funktion über dynamisches SQL ändern könnten? Sie verstoßen gegen die Definition einer deterministischen Funktion.

Beachten Sie, dass MySQL diese Option in /etc/my.cnf hinzugefügt hat

log-bin-trust-function-creators

Obwohl dies eine zu vereinfachte Verfolgung sein kann, ermöglicht dies Funktionen, Daten in binäre Protokolle zu schreiben, ohne die deterministische Eigenschaft streng durchzusetzen.

Aspekt Nr. 2: Trigger sollten in der Lage sein, zurückgerollt zu werden

  • Können Sie sich einen Auslöser mit den gleichen Verhaltensweisen wie eine Funktion vorstellen und dann dynamische SQL in den Mix einführen?
  • Könnten Sie sich vorstellen, sich zu bewerben? MVCC (Multiversion Concurrecy Control) Gegen dynamisches SQL nach Anwendung von MVCC auf den Basistabelle war der Trigger gedacht?

Sie würden im Wesentlichen Daten haben, die allein in MVCC quadratisch (sogar exponentiell) wachsen. Der Prozess der Verwaltung des Rollbacks von SQL mit Triggern, die nicht deterministisch sein können, wäre, gelinde gesagt, gottlos.

In Anbetracht dieser beiden Aspekte dachte ich mir sicher, dass MySQL -Entwickler an diese Dinge gedacht und sie schnell ab wiet, indem sie Beschränkungen auferlegten.

Warum also die Einschränkung für Verfahren heben? Einfach ausgedrückt, es gibt keine Bedenken hinsichtlich deterministischer Eigenschaften oder Rollback.

Andere Tipps

Dies ist eine großartige Frage, aber ich kenne die Antwort nicht. Ich kann mir vorstellen, dass dies das Interna -Team besuchen muss, aber ich weiß nicht, dass sie in dieser Seite groß sein werden. In der Zwischenzeit kann ich Ihnen helfen, einige Antworten abzuleiten.

Für den Anfang sehe ich das:

Der Trigger -Cache erkennt nicht, wann sich die Metadaten der zugrunde liegenden Objekte geändert haben. Wenn ein Trigger eine Tabelle verwendet und die Tabelle seit dem Laden des Triggers in den Cache geändert wurde, arbeitet der Trigger mithilfe der veralteten Metadaten.

Was mich denken lässt, dass das etwas damit zu tun hat. Es wird SQL nicht neu kompilieren, wenn es nicht einmal die Metadaten überwacht. Was bedeutet, dass es ein Motorproblem ist.

Aus dem gleichen Grund, wenn ich diesen Block lese, denke ich dasselbe (Motor):

Um die Interaktionsprobleme zwischen Server -Threads zu verhindern, verwendet der Server, wenn ein Client eine Anweisung ausgibt, einen Schnappschuss von Routinen und Auslösern, die für die Ausführung der Anweisung verfügbar sind. Das heißt, der Server berechnet eine Liste von Verfahren, Funktionen und Auslöser, die während der Ausführung der Anweisung verwendet werden können, lädt sie und fährt dann fort, die Anweisung auszuführen. Dies bedeutet, dass die Anweisung zwar ausgeführt wird, jedoch keine Änderungen an Routinen angezeigt werden, die von anderen Threads durchgeführt werden.

Alles in allem bin ich mir nicht ganz sicher, warum sie es nicht zulassen, aber ich kann es vermuten. Tut mir leid, dass ich Ihnen nicht mehr helfen kann, ich bin offen dafür, dies noch mehr herauszufinden. Am besten hoffen Sie auf einige aktive MySQL -Entwickler, sobald wir private Beta verlassen;)

Vor allem liegt es an Sicherheit. Die Ausnahme für Prozeduren liegt darin, dass dem dynamischen SQL innerhalb der Prozedur im Sicherheitskontext des ausführenden Benutzers zugewiesen werden kann. Dies bedeutet, dass der Motor auch nicht weiß was wird ausgeführt, es kann sicherstellen, dass der Benutzer auf die referenzierten Objekte zugreifen darf.

Darüber hinaus können Sie die hässlichen Probleme dessen aufwerfen, was passieren könnte, wenn es zulässig wäre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top