web-dev-qa-db-fra.com

Mise à jour de la gâchette MySQL via INFORMATION_SCHEMA - Accès refusé?

J'ai du mal "définitivement" S pour certains déclencheurs dans MySQL (en fait Mariadb). J'ai pensé que le moyen le plus simple de les corriger serait une version de:

use information_schema;
update triggers set definer=current_user() where trigger_schema='foobar';

Cela produit:

ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'information_schema'

Dans la même session, je peux laisser tomber et recréer les déclencheurs avec "déclencheur de goutte" et "créer un déclencheur", donc je ne comprends pas le problème des autorisations. Y a-t-il un privilège que mon utilisateur a besoin de cela que cela n'a pas?

3
Johannes Ernst

Ce que vous faites est impossible car la base de données INFORMATION_SCHEMA est une base de données composée de tables temporaires en lecture seule en mémoire (voir mon message Comment Information_schema implémentée dans MySQL? )

Vous allez devoir laisser tomber les déclencheurs et les recréer

J'ai écrit un post à ce sujet avant (Oct 02, 2011: CAN Les déclencheurs et les procédures de MySqldump? )

Voici ce que vous pouvez faire pour tous les déclencheurs de la base de données foo

Étape 01: MySqldump Les déclencheurs

MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
mysqldump -${MYSQL_CONN} -d -t --skip-routines --triggers foo > foo_make_triggers.sql

Pour clarification

Étape 02: Créez un script pour laisser tomber tous les déclencheurs

MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
SQL="SELECT CONCAT('DROP TRIGGER ',trigger_name,';')"
SQL="${SQL} FROM information_schema.triggers"
SQL="${SQL} WHERE trigger_schema = 'foo'"
mysql ${MYSQL_CONN} -ANe"${SQL}" > foo_drop_triggers.sql

Étape 03: Vérifiez les contenus de chaque fichier

vi -R foo_drop_triggers.sql
vi -R foo_make_triggers.sql

Étape 04: Modifiez tous les définisseurs en foo_make_triggers.sql Comme vous savez comment

Étape 05: Connectez-vous à MySQL et exécutez ceci

use foo
source foo_drop_triggers.sql
source foo_make_triggers.sql

Testez ceci sur un serveur de stadification s'il vous plaît

ESSAIE !!!

6
RolandoMySQLDBA