2011-06-25 20 views
22

Para la corrección de la prueba de la consulta, necesito deshabilitar todos los desencadenadores en db. Veo que en information_schema existe la tabla TRIGGERS. ¿Es posible deshabilitar temporalmente todos los activadores usando esta tabla? P. ej. como:MySQL deshabilita todos los desencadenantes

update TRIGGERS set TRIGGERS_SCHEMA='myschema_new' 
where TRIGGERS_SCHEMA='myschema' 

y después de terminar todas las pruebas de devolver todos los desencadenantes como:

update TRIGGERS set TRIGGERS_SCHEMA='myschema' 
where TRIGGERS_SCHEMA='myschema_new' 

Puede ser esto puede corromper disparadores db o después no va a obras? No lo encontré en la documentación.

+3

Las tablas 'information_schema' no pueden ser modificados de todos modos. En realidad son vistas: [referencia] (http://dev.mysql.com/doc/refman/5.1/en/information-schema.html). –

+0

@Joel B Fant - +1 No tenía idea. Gracias por compartir. :) –

Respuesta

31

No puede deshabilitar los desencadenantes directamente y no recomendaría hacer lo que está sugiriendo pero podría tener su comprobación de activador si una variable (en mi ejemplo debajo de @disable_triggers) es NULL antes de ejecutar el contenido del desencadenador. Por ejemplo:

Consulta:

SET @disable_triggers = 1; 
// Your update statement goes here. 
SET @disable_triggers = NULL; 

disparadores:

IF @disable_triggers IS NULL THEN 
    // Do something use as the trigger isn't disabled. 
END IF; 
+6

Tengo cerca de 1000 desencadenantes, es muy difícil hacer lo que recomiendas. –

+0

@Lorenzo Manucci - Me temo que no hay una forma de desactivar o activar los disparadores en MySQL. Debería recrear todos los desencadenadores si esto es algo que tendrá que hacer de forma constante o volver a crearlos si no funcionan correctamente. No estoy del todo convencido de que la modificación de la base de datos 'information_schema' sea una buena idea, pero si resuelve tu problema y esto es algo que ocurre una sola vez, haz una copia de seguridad de todas tus bases de datos y hazlo. –

+0

Compruebe el valor actual con 'SELECT @disable_triggers;' – user427969

0

No es posible 'desactivar' desencadena en MySQL, sin embargo, un truco que puede ser utilizado para obtener alrededor de este

Agregue una condición en sus desencadenantes como:

if (DISABLE_TRIGER <> 1) then 
#trigger body 
end if; 

y que si desea desactivar los factores desencadenantes en la importación simplemente:

SET @DISABLE_TRIGER = 1;

hacer importaciones

SET @DISABLE_TRIGER = 0; 
+0

Y tampoco puedo cambiar el código de desencadenadores porque no soy el autor; estos desencadenadores arreglarán a otra persona porque no funcionan correctamente, pero debo terminar mi trabajo: prueba todas las preguntas para insertar. –

Cuestiones relacionadas