Modifier DEFINER sur plusieurs vues


25

J'ai des problèmes pour sauvegarder mes bases de données après une mise à jour. J'ai fouillé mon système pour essayer de comprendre pourquoi. Une requête que j'ai exécutée a renvoyé ce résultat.

Got error: 1449: The user specified as a definer ('cittool'@'%') does not exist when using LOCK TABLES

Après quelques recherches, il apparaît que le définisseur de ces vues est un ancien compte de développeur qui a été purgé du système. Les bases de données et les vues présentant ce problème sont très rarement utilisées et la plupart sont conservées à des fins d'archivage.

Il y a environ 40 vues avec un définisseur qui n'existe plus. Existe-t-il un moyen simple de changer le définisseur en un compte différent sur tout à la fois? Existe-t-il un moyen pour que mysqldump vide simplement toutes les vues dans un fichier afin que je puisse éditer ce fichier et recréer les vues?


pour moi, je viens d'ajouter le compte manquant à la base de données et l'erreur a disparu.
user1794918

Réponses:


13

Créez un fichier texte avec toutes les définitions de vue:

mysql -uusername -ppassword -A --skip-column-names -e"SELECT CONCAT('SHOW CREATE VIEW ',table_schema,'.',table_name,'\\G') FROM information_schema.tables WHERE engine IS NULL" | mysql -uusername -ppassword -A --skip-column-names > AllMyViews.sql

Vous modifiez AllMyViews.sql à partir de là. Ensuite, supprimez les vues

mysql -uusername -ppassword -A --skip-column-names -e"SELECT CONCAT('DROP VIEW ',table_schema,'.',table_name,';') FROM information_schema.tables WHERE engine IS NULL" | mysql -uusername -ppassword -A

Après avoir modifié AllMyViews.sql, rechargez-les

mysql -uusername -ppassword -A < AllMyViews.sql

Essaie !!!


+1 comme une excellente alternative si la vue_définition du schéma_information ne s'affiche pas, mais SHOW CREATE VIEW fonctionne correctement.
Derek Downey

Bien que j'aimais mieux la solution de DTest en théorie, quelque chose à propos de mon système l'empêchait de fonctionner. J'ai essentiellement utilisé ce qui précède pour vider les instructions show create dans un fichier, et j'ai dû les modifier manuellement un peu, puis les exécuter.
Zoredache

SHOW CREATE VIEW ne fonctionne pas lorsque l'utilisateur définisseur n'existe pas - il génère la même erreur que mysqldump:The user specified as a definer ('abc'@'1.2.3.4') does not exist
Marki555

@ Marki555 Ensuite, vous devez créer cet utilisateur temporairement. courir CREATE USER 'abc'@'1.2.3.4';. Ensuite, réessayez.
RolandoMySQLDBA

Je viens de remarquer que la vue utilise une procédure stockée et que le message d'erreur est transmis au définisseur de cette procédure, pas
s'afficher

25

Vous pouvez utiliser ALTER VIEW conjointement avec le schéma d'informations . Vous avez mentionné le vider dans un fichier texte, alors peut-être quelque chose comme ça:

SELECT CONCAT("ALTER DEFINER=`youruser`@`host` VIEW `",table_name,"` AS ", view_definition,";") 
FROM information_schema.views WHERE table_schema='databasename'

Mélangez cela avec la ligne de commande mysql (en supposant que * nix, pas familier avec Windows):

> echo "*abovequery*" | mysql -uuser -p > alterView.sql
> mysql -uuser -p databasename < alterView.sql

Sidenote: Vous ne pouvez pas modifier directement les entrées information_schema . Note2: Cela ne fonctionne que pour une seule base de données à la fois, si vous laissez WHERE table_schema, vous devez insérer des commandes USE entre chacune.


J'aime ça parce qu'il a l'air un peu moins impliqué et plus concis que le mien. +1 !!! (J'ai oublié ALTER VIEW)
RolandoMySQLDBA

Une idée pourquoi le champ view_definition serait vide? SELECT table_name,view_definition FROM information_schema.views WHERE table_schema='cittmp'; retours| Staff | |
Zoredache

De la discussion dans le chat, il semble que ce soit un problème d'autorisation avec le super privilège. bugs.mysql.com/bug.php?id=39733
Derek Downey

Solution parfaite! +1
Pablo Martinez

Au moins sur RedHat, si vous exportez vers un fichier, vous devez échapper aux tiques arrière, par exempleecho "SELECT CONCAT("ALTER DEFINER=\`youruser\`@\`host\` VIEW...
clav

3

En automatisant la solution Derek, cela changera DEFINER root@localhostet définira SQL SECURITY INVOKER(assurez-vous que vous le voulez d'abord!) Dans toutes les vues de toutes les bases de données:

mysql -BNe 'show databases' | \
egrep -v '^(information_schema|performance_schema)$' | \
while read DB
do 
    mysql -BNe "SELECT CONCAT(\"ALTER DEFINER=\`root\`@\`localhost\` SQL SECURITY INVOKER VIEW \",table_name,\" AS \", view_definition,\";\") FROM information_schema.views WHERE table_schema=\"$DB\"" | \
    mysql $DB
done

AVERTISSEMENT: assurez-vous d'avoir fait une sauvegarde complète de mysql (par exemple en arrêtant mysqld et en sauvegardant tous les fichiers dans / var / lib / mysql) avant de l'exécuter - juste au cas où ... Cela a fonctionné pour moi, mais YMMV .

vous devez également vérifier toutes vos tables / vues avec:

mysql -BNe 'show databases' | \
egrep -v '^(information_schema|performance_schema)$' | \
while read DB
do 
   mysql -BNe 'show tables' $DB | \
   while read t
   do
      echo "check table $t;"
   done | mysql -BN $DB
done | \
egrep -v 'status\s*OK'

il ne devrait plus se plaindre de définitions invalides dans les vues.


Sans vergogne, j'ai ajouté ceci à mes extraits. Merci!
stefgosselin

3

Exportez toutes les vues de la base de données <DB>:

mysql -BNe "SELECT TABLE_NAME FROM TABLES WHERE TABLE_SCHEMA = '<DB>' AND TABLE_TYPE = 'VIEW'" \
    information_schema | xargs mysqldump --single-transaction --no-data <DB> >views.sql

ou:

mysql -BNe "SELECT TABLE_NAME FROM VIEWS WHERE TABLE_SCHEMA = '<DB>'" \
    information_schema | xargs mysqldump --single-transaction --no-data <DB> >views.sql

Editez views.sql(change definer) et recréez-les:

cat views.sql | mysql <DB>

Spécifiez -uet -pchangez si nécessaire.


De quelle manière les VUES,, devraient-elles views.sqlêtre modifiées? Aussi, comment les recréer?
SherylHohman

@SherylHohman Changer DEFINER = olduser@oldhostpour DEFINER = newuser@newhost, cat views.sql | mysql <DB>recrée les vues.
x-yuri
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.