Domanda

Secondo le restrizioni Su Stored Procedure e trigger , dinamica SQL non può essere utilizzato (restrizione sollevato per stored procedure in versione 5.0.13 e successive). Perché questa limitazione al suo posto? E perché sollevarlo per le procedure, ma non funzioni o trigger?

È stato utile?

Soluzione

Basta sentire la domanda mi fa pensare a due aspetti:

ASPETTO # 1: Le funzioni si suppone siano DETERMINISTICO

In questo modo, questo implica che una funzione dovrebbe presentare gli stessi dati di ritorno costantemente per un dato insieme di parametri, non importa quando si chiama la funzione.

Ora, immaginate una funzione che produce una risposta diversa a causa della raccolta di dati in diversi momenti della giornata in base a SQL statica nella funzione. In un certo senso, che può ancora essere considerato DETERMINISTICO se si esegue una query lo stesso insieme di tabelle e colonne ogni volta, dato lo stesso insieme di parametri.

E se fosse possibile modificare le tabelle sottostanti di una funzione tramite SQL dinamico? È violare la definizione di una funzione deterministica.

Si noti che MySQL ha aggiunto questa opzione nella /etc/my.cnf

log-bin-trust-function-creators

Anche se questo può essere una semplificazione eccessiva di dire, questo permette funzioni per poter scrivere i dati in log binari, senza far rispettare rigorosamente la proprietà deterministico.

ASPETTO # 2: trigger dovrebbe essere in grado di eseguire il rollback

  • Si potrebbe immaginare un trigger con tutti gli stessi comportamenti in funzione e quindi l'introduzione di SQL dinamico nel mix?
  • Potete immaginare cercando di applicare MVCC (Multiversion Concurrecy Control) contro SQL dinamico dopo l'applicazione MVCC alla tabella di base il grilletto era destinato a?

Si avrebbe in sostanza, avere dati che cresce al quadrato (anche in modo esponenziale) proprio in MVCC solo. Il processo di gestione del rollback di SQL con i trigger che possono essere non-deterministico sarebbe empio complessa, per non dire altro.

Alla luce di questi due aspetti, sono sicuro che MySQL sviluppatori pensato a queste cose e rapidamente respinto imponendo restrizioni.

Quindi, perché sollevare la restrizione per le procedure? In poche parole, non v'è alcuna preoccupazione per le proprietà deterministiche o rollback.

Altri suggerimenti

Questa è una grande domanda, ma non so la risposta. Immagino che questo sta per avere a goto il team interni, ma non so che essi saranno grandi in questo sito. Nel frattempo, mi può aiutare a dedurre alcune risposte.

Per cominciare vedo questo:

La cache grilletto non rileva quando i metadati degli oggetti sottostanti è cambiato. Se un trigger utilizza una tabella e la tabella è cambiato da quando il grilletto è stato caricato nella cache, il grilletto funziona utilizzando i metadati obsoleti.

Il che mi fa pensare che che ha qualcosa a che fare con esso. Non sta andando essere ricompilazione SQL se non è nemmeno il monitoraggio dei metadati. Che significa che è una preoccupazione del motore.

Per lo stesso motivo, quando ho letto questo blocco Penso che la stessa cosa (motore):

Per evitare problemi di interazione tra i thread del server, quando un client problemi una dichiarazione, il server utilizza uno snapshot di routine e trigger disponibili per l'esecuzione della dichiarazione. Cioè, il server calcola una lista di procedure, funzioni e trigger che possono essere utilizzati durante l'esecuzione dell'istruzione, li carica, e poi procede per eseguire l'istruzione. Ciò significa che mentre le esegue statement, non vedrà le modifiche alle routine eseguite da altri thread.

Quindi, tutto sommato io non sono del tutto sicuro perché non lo consentono, ma posso indovinare. Mi dispiace che non posso aiutare di più, io sono aperto a sussing questo fuori ancora un po '. La cosa migliore è la speranza per alcuni sviluppatori di MySQL attivi una volta lasciamo beta privata;)

In gran parte, ciò è dovuto alla sicurezza. L'eccezione per le procedure è perché lo SQL dinamico all'interno di procedura può essere assegnato il contesto di protezione dell'utente che esegue. Ciò significa che, anche se il motore non conosce cosa sta per essere eseguito, si può essere certi che l'utente può accedere l'oggetto di riferimento (s).

Oltre a ciò, è possibile aumentare il brutto questioni di ciò che potrebbe accadere, se fosse consentito.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top