Tengo una base de datos que he clonado, y ahora todos los desencadenadores apuntan a las tablas de registro en el esquema original. Necesito eliminarlos todos de una vez (hay varias docenas) para poder recrearlos. ¿Cómo se puede hacer esto con un comando?¿Cómo puedo eliminar todos los desencadenantes en una base de datos MySQL usando una declaración SQL?
Respuesta
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]
No estoy seguro de la existencia de un solo comando para este fin.
Pero aquí es cómo lo hice hace algún tiempo
- guión Escribir al obtener la lista de disparadores en dB.
- Crear lista Concated en dropTrigger.sql Archivo de
- Run dropTrigger.SQL
Para obtener la lista de disparadores También se puede usar SHOW trigger o Triggers table in Information schema
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);
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á.
¿No podría usar una instrucción preparada con un procedimiento almacenado para soltar un desencadenador? – jcoffland
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
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
SELECT Concat('DROP TRIGGER ', Trigger_Name, ';') FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA = 'your_schema';
copia y pega el código SQL generado
Esta es, de lejos, la mejor respuesta – user2831723
¿Dónde has sido amigo? (y) – NullPointer
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.
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.
- 1. ¿Cómo se enumeran todos los factores desencadenantes en una base de datos MySQL?
- 2. MySQL deshabilita todos los desencadenantes
- 3. ¿Cómo identifica los desencadenantes asociados con una tabla en una base de datos de sybase?
- 4. ¿Cómo enumero (o exporto) el código para todos los desencadenantes en una base de datos?
- 5. ¿Cómo puedo volcar una base de datos MySQL usando hormiga?
- 6. ¿Cómo puedo eliminar todos los registros en una base de datos en CouchDB?
- 7. Mysql: cuándo utilizar los desencadenantes
- 8. ¿Cómo eliminar desde una base de datos?
- 9. Revocar todos los privilegios para todos los usuarios en una base de datos MySQL
- 10. ¿Cómo obtengo una lista de todos los esquemas en una base de datos del servidor Sql?
- 11. ¿Cómo vaciar una base de datos SQL?
- 12. ¿Cómo puedo obtener los valores posibles enum en una base de datos MySQL usando php?
- 13. ¿Cómo elimino una base de datos MySQL?
- 14. Eliminar todos los datos en la base de datos SQL Server
- 15. Cómo copiar una tabla de una base de datos mysql a otra base de datos mysql
- 16. ¿Cómo puedo probar si una columna existe en una tabla usando una declaración SQL?
- 17. MySQL: Recorte todos los campos en la base de datos
- 18. Usando LINQ to SQL para crear una base de datos
- 19. Cómo colocar todas las tablas de una base de datos en SQL Server 2005 en una declaración, excepto una tabla
- 20. ¿Puedo crear una base de datos usando PDO en PHP
- 21. ¿Cómo puedo automatizar la exportación de una base de datos mySQL usando phpMyAdmin
- 22. cómo enumerar todos los objetos de una base de datos en particular en SQL Server 2005
- 23. ¿Cómo contar todos los procedimientos almacenados en el Servidor SQL para una base de datos?
- 24. ¿Obtiene todos los nombres de tabla de una base de datos particular mediante consulta SQL?
- 25. ¿Cómo puedo cargar un archivo mysqldump .sql en una base de datos MySQL en Windows Vista?
- 26. Cómo crear una base de datos Esquema usando Hibernate
- 27. ¿Cómo puedo mantener segura una base de datos mySQL?
- 28. Cómo eliminar todos los datos en una tabla en SQL CE?
- 29. ¿Cómo puedo ejecutar un archivo de texto SQL en una base de datos MySQL?
- 30. ¿Cómo puedo devolver los datos numéricos de cuadro de todos los resultados usando 1 consulta mySQL?
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]" –
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. –
Tenga en cuenta que los usuarios de BSD y OS X necesitarán usar 'sed -E' en lugar de' sed -r'. – nofinator