2012-09-28 32 views

Respuesta

24

Esta es una vieja pregunta, pero como es la que sigue apareciendo en mis búsquedas, pensé en publicar una solución aquí. En mi caso, necesitaba crear un solo archivo que tuviera un total de mysqldump, luego descartaría los desencadenantes y luego volvería a agregarlos. Pude hacerlo usando el siguiente comando para anexar las declaraciones DROP TRIGGER a mi volcado antes de anexar el volcado de los activadores.

mysql -u [db user] -p[db password] --skip-column-names [db name] -e 'SHOW TRIGGERS;' | cut -f1 | sed -r 's/(.*)/DROP TRIGGER IF EXISTS \1;/' >> dump.sql 

a la caída de realidad todos los disparadores en el mismo comando (como se ha mencionado por @Stephen Crosby en los comentarios), sólo puede tubería esta de nuevo en MySQL, así:

mysql -u [db user] -p[db password] --skip-column-names [db name] -e 'SHOW TRIGGERS;' | cut -f1 | sed -r 's/(.*)/DROP TRIGGER IF EXISTS \1;/' | mysql -u [db user] -p[db password] [db name] 
+2

Me encanta.Pero también puede conectarlo directamente a mysql en lugar de a un archivo: En lugar de ">> dump.sql", puede usar "| mysql -u [usuario de db] -p [contraseña de db]" –

+0

Eso depende mucho o su caso de uso. Para mí, estaba creando un archivo de volcado de una base de datos esclava que se usa para actualizar nuestras bases de datos de desarrollo. Esto es solo parte de ese archivo de volcado. No me gustaría ejecutar esto contra nuestro DB de producción, pero es parte del proceso de actualización de una copia local del DB de producción para el desarrollo. Eso sería muy útil, aunque si quieres ejecutarlo contra la misma base de datos. –

+0

Tenga en cuenta que los usuarios de BSD y OS X necesitarán usar 'sed -E' en lugar de' sed -r'. – nofinator

0

No estoy seguro de la existencia de un solo comando para este fin.

Pero aquí es cómo lo hice hace algún tiempo

  1. guión Escribir al obtener la lista de disparadores en dB.
  2. Crear lista Concated en dropTrigger.sql Archivo de
  3. Run dropTrigger.SQL

Para obtener la lista de disparadores También se puede usar SHOW trigger o Triggers table in Information schema

-4

La respuesta rápida es "no".

Pero puede encapsular la lógica en un procedimiento almacenado: obtenga todos los desencadenantes y elimínelos en bucle utilizando SQL dinámico.

después de que se puede ejecutar: call delete_all_triggers_api(schema_name);

7

Desafortunadamente esto no es posible en una instrucción SQL regular o un procedimiento almacenado.

Solución

La solución más simple para eliminar todos los disparadores que podría ser una escritura del golpe:

echo "select concat('drop trigger ', trigger_name, ';') 
    from information_schema.triggers where trigger_schema = 'your_database'" | 
    mysql --defaults-extra-file=.mysql.conf --disable-column-names | 
    mysql --defaults-extra-file=.mysql.conf 

Esto requiere un archivo de credenciales (.mysql.conf) de esta manera:

[client] 
database=your_database 
user=your_username 
password=your_password 

Razonamiento

Intentar soltar un desencadenante de un procedimiento almacenado fallará. Supongo que esto se debe a que una variable sólo puede contener una cadena y drop trigger requiere un nombre de disparo (no es una cadena que contiene un nombre de disparo):

create procedure drop_a_trigger() 
begin 
    declare var1 varchar(1024); 
    set var1 = "my_second_trigger"; 

    drop trigger my_first_trigger;  // OK 
    drop trigger address_update_before; // ERROR 1360 (HY000): Trigger does not exist 

end // 
delimiter ; 

call drop_a_trigger(); 

Hay dos hilos sobre esto en los foros de MySQL:

ambos llegan a la misma conclusión que incluso utilizando un almacenada el procedimiento no ayudará.

+0

¿No podría usar una instrucción preparada con un procedimiento almacenado para soltar un desencadenador? – jcoffland

3
SELECT Trigger_Name 
FROM `information_schema`.`TRIGGERS` 
WHERE TRIGGER_SCHEMA = 'your_schema'; 

resultados de copia al portapapeles

convertido Trigger_name a DROP TRIGGER <trigger_name>; para cada disparador en el^etiquetas y S para comenzar y terminar de acuerdo con reg.expressions

ejecución como secuencia de comandos SQL

0

MAC utilizando MAMP:

Hay algunos pequeños ajustes que hay que hacer a la respuesta aceptada por nosotros. Primero debemos apuntar a mysql en MAMP. En segundo lugar, sed -r no funciona para Mac, use sed -E en su lugar. Asumiendo la configuración estándar de MAMP, sin cambios en los valores predeterminados del usuario root, solo reemplace [db name] con su db, luego copie y pegue en la Terminal y presione enter.

/Applications/MAMP/Library/bin/mysql -u root -proot --skip-column-names [db name] -e 'SHOW TRIGGERS;' | cut -f1 | sed -E 's/(.*)/DROP TRIGGER IF EXISTS \1;/' | /Applications/MAMP/Library/bin/mysql -u root -proot [db name] 

(si ha actualizado su contraseña de root, sólo cambio a cabo "raíz" después -p con su contraseña

17
SELECT Concat('DROP TRIGGER ', Trigger_Name, ';') FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA = 'your_schema'; 

copia y pega el código SQL generado

+1

Esta es, de lejos, la mejor respuesta – user2831723

+0

¿Dónde has sido amigo? (y) – NullPointer

4

No es posible borrar todos los desencadenantes en una base de datos MySQL usando una declaración SQL.

Pero con el siguiente código SQL puede compilar la lista de todos los estadistas 'DROP TRIGGER' ts (reemplazar <su_schema> con el nombre de su esquema, p. el nombre de la base):

-- set `group_concat_max_len` 
SET @@session.group_concat_max_len = @@global.max_allowed_packet; 

-- select all the triggers and build the `DROP TRIGGER` SQL 
-- replace <your_schema> with your schema name (e.g. your database name) 
SELECT GROUP_CONCAT(sql_string SEPARATOR '\n') 
FROM (
    SELECT CONCAT('DROP TRIGGER IF EXISTS `', TRIGGER_NAME, '`;') AS sql_string,'1' 
    FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA = '<your_schema>' 
    ) AS sql_strings 
GROUP BY '1'; 

El resultado de la consulta anterior producirá algo como:

DROP TRIGGER IF EXISTS `trigger1`; 
DROP TRIGGER IF EXISTS `trigger2`; 
(...) 

Y puede utilizar estas sentencias SQL para eliminar finalmente todos los disparadores.

La variable del sistema del servidor group_concat_max_len es la longitud de resultado máxima permitida en bytes para la función GROUP_CONCAT(). Como el valor predeterminado es 1024, debemos aumentarlo para evitar un resultado truncado si tenemos muchos factores desencadenantes. Acabo de utilizar el valor de la variable del sistema del servidor max_allowed_packet, pero por lo general está bien cualquier número entero grande. Ver this other question.

0

En caso de que quiera renunciar a ellos mediante una consulta sin la necesidad de sqldump la base de datos en un archivo:

select concat('drop trigger ', trigger_name, ';') from information_schema.triggers where trigger_schema = 'your_schema'; A continuación, tendrá que exportar los resultados (encuentro a CSV es más fácil) y ejecutar el consultas en esos resultados.

Cuestiones relacionadas