Saltar al contenido

Cómo cambiar masivamente MySQL Triggers DEFINER

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 DEFINERs. 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *