Comment modifier en bloc MySQL Triggers DEFINER

j'ai travaillé sur notre serveur de développement interne et j'ai créé des déclencheurs MySQL sur notre serveur MySQL 5.6.13. Le problème que j'ai maintenant est que les déclencheurs (environ 200 au total) ont été créés avec AS DEFINER=root@% sur le serveur interne.

maintenant je veux passer au serveur de production en direct. Cependant sur notre serveur, nous ne permettons pas de cet accès pour l'utilisateur root. Par conséquent, comment puis-je modifier en bloc tous mes déclencheurs, de sorte qu'il lit DEFINER=root@localhost

16
demandé sur neildt 2013-09-03 17:35:09

6 réponses

Une façon de le faire:

1) Vidage de déclencher des définitions dans un fichier

# mysqldump -uroot -p --triggers --add-drop-trigger --no-create-info \
      --no-data --no-create-db --skip-opt test > /tmp/triggers.sql

2) Ouvert triggers.sql dans votre éditeur préféré et utilisez Find and Replace fonctionnalité à modifier DEFINER S. Enregistrer le fichier mis à jour.

3) Recréer déclenche à partir du fichier

# mysql < triggers.sql
45
répondu peterm 2013-09-03 15:47:17

sans utiliser l'option 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 ;/g' \
| perl -0777 -pe 's/(DEFINER[^`]+)'$currentUserDefiner'(`@`)'$currentHostDefiner'/'$newUserDefiner''$newHostDefiner'/gi' \
> out.sql
mysql -u root < out.sql
3
répondu Xorax 2015-03-12 10:22:00

la réponse acceptée n'a pas fonctionné pour moi parce que la plupart de mes clients sont hébergés sur des serveurs avec 5.5 et je ne peux pas faire grand chose à ce sujet, et le --add-drop-la fonction de déclenchement a été ajouté à 5.6

après m'être cogné la tête dessus, je suis juste allé à phpMyAdmin qui expose le definer sur la page trigger edit et j'ai simplement édité le definer pour la vingtaine de triggers qui étaient erronés - phpMyAdmin va laisser tomber et recréer le trigger avec le nouveau definer.

une autre option que j'ai trouvée était de faire un mysqldump complet, éditer le fichier résultant, l'utiliser pour créer une nouvelle base de données, puis utiliser un outil comme Navicat pour effectuer une synchronisation de structure de retour à la base de données originale en sélectionnant seulement les déclencheurs désirés dans la liste de comparaison résultant. Cela a été un processus beaucoup plus long pour moi parce que je devais seulement éditer 20 déclencheurs, mais si je devais mettre à jour des centaines de déclencheurs ce serait plus rapide.

1
répondu Craig Jacobs 2014-08-23 21:51:22

une autre approche consiste à utiliser cet utilitaire Java. Notez qu'il s'agit d'un travail en cours car la version 1.0 actuelle efface certaines variables du serveur. newdef

1
répondu user3092412 2016-05-01 15:30:36

une autre variation sur le thème utilisant une option dans MySQL Workbench est de dumper la base de données entière en utilisant "mysqldump", ouvrir le dump dans un éditeur capable, trouver remplacer par "DEFINER" désiré, puis importer avec MyQSL Workbench avec "option de structure de Dump" (v6.2) selected on the import screen.

0
répondu Damon 2017-02-19 02:19:15

je sais que c'est un vieux post, mais peut-être qu'il peut aider quelqu'un.

j'utilise cette requête sql pour générer un DROP et une commande 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";

Je l'utilise dans mon application quand je prends la base de données de production sur ma machine de développement et je l'utilise avec un foreach sur toutes les commandes et recréer les déclencheurs automatiquement. Cela me donne la possibilité de l'automatiser.

exemple dans 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;
    }

indice: je dois le faire avec AOP à cause de la problème de requête de tampon mysql, décrit ici

de même je faire pour que mon point de vue (Ici, vous pouvez utiliser la commande 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']);
    }

j'Espère que ça aide.

0
répondu ndberg 2018-06-20 07:53:40