Basta ya de indagar por otros sitios porque has llegado al espacio exacto, contamos con la respuesta que necesitas pero sin problema.
Solución:
Una forma de hacerlo:
1) Volcar definiciones de disparadores en un archivo
# mysqldump -uroot -p --triggers --add-drop-trigger --no-create-info
--no-data --no-create-db --skip-opt test > /tmp/triggers.sql
2) abierto triggers.sql
archiva en tu editor favorito y usa Find and Replace
función para cambiar DEFINER
s. Guardar archivo actualizado.
3) Recrear disparadores desde el archivo
# mysql < triggers.sql
Sin usar la opción --add-drop-trigger:
currentUserDefiner='root'
currentHostDefiner='localhost'
newUserDefiner='user'
newHostDefiner='localhost'
db='myDb'
mysqldump -u root --triggers --no-create-info --no-data --no-create-db --skip-opt $db
| perl -0777 -pe 's/(n/*.+?50003 TRIGGER `([^`]+)`)/nDROP TRIGGER 2;1/g'
| perl -0777 -pe 's/(DEFINER[^`]+)'$currentUserDefiner'(`@`)'$currentHostDefiner'/1'$newUserDefiner'2'$newHostDefiner'/gi'
> out.sql
mysql -u root < out.sql
Sé que es una publicación antigua, pero tal vez pueda ayudar a alguien.
Uso esta consulta sql para generar un comando DROP y CREATE:
SELECT CONCAT("DROP TRIGGER ", trigger_name, ";", " CREATE TRIGGER ", TRIGGER_NAME, " AFTER ", EVENT_MANIPULATION, " ON ", EVENT_OBJECT_SCHEMA, ".", EVENT_OBJECT_TABLE, " FOR EACH ROW ", ACTION_STATEMENT, ";") AS sqlCommand FROM information_schema.triggers WHERE EVENT_OBJECT_SCHEMA = "yourdatabase";
Uso esto en mi aplicación cuando llevo la base de datos de producción a mi máquina de desarrollo y la uso con un foreach sobre todos los comandos y vuelvo a crear los activadores automáticamente. Esto me da la opción de automatizarlo.
Ejemplo en PHP/Laravel:
$this->info('DROP and CREATE TRIGGERS');
$pdo = DB::connection()->getPdo();
$sql = 'SELECT CONCAT("DROP TRIGGER ", trigger_name, ";", " CREATE TRIGGER ", TRIGGER_NAME, " AFTER ", EVENT_MANIPULATION, " ON ", EVENT_OBJECT_SCHEMA, ".", EVENT_OBJECT_TABLE, " FOR EACH ROW ", ACTION_STATEMENT, ";") AS sqlCommand FROM information_schema.triggers WHERE EVENT_OBJECT_SCHEMA = "mydatabase";';
$stmt = $pdo->prepare($sql, [PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true]);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stmt->closeCursor();
foreach($result as $rs)
$pdo = DB::unprepared($rs['sqlCommand']);
break;
Sugerencia: tengo que hacerlo con pdo debido al problema de consulta del búfer mysql, descrito aquí
Lo mismo hago para mis vistas (Aquí puedes usar ALTER TABLE):
$pdo = DB::connection()->getPdo();
$sql = 'SELECT CONCAT("ALTER DEFINER=`homestead` VIEW ", table_name," AS ", view_definition,";") AS sqlCommand FROM information_schema.views WHERE table_schema="mydatabase";';
$stmt = $pdo->prepare($sql, [PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true]);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stmt->closeCursor();
$this->info('View definer changed');
foreach($result as $rs)
$pdo = DB::unprepared($rs['sqlCommand']);
Espero eso ayude.
Si guardas algún titubeo o capacidad de arreglar nuestro artículo puedes ejecutar una referencia y con placer lo estudiaremos.