web-dev-qa-db-fra.com

Comment réparer une vue SQL cassée

J'utilise le système de gestion de contenu open source pimcore (http://www.pimcore.org), qui s'exécute sur un serveur MySQL.

Il utilise des vues assez compliquées pour représenter des objets et l’un d’eux est devenu cassé à un moment donné lorsqu’une colonne d’une autre table référencée par la vue a été renommée. Chaque fois que j'essaie d'interagir avec la table via des commandes SQL, le message d'erreur suivant s'affiche: 

La vue 'barriste_website.object_6' fait référence à une (des) table (s) non valide (s) ou colonne (s) ou fonction (s) ou définisseur/invocateur de la vue ne dispose pas des droits d’utilisation leur

J'aimerais simplement mettre à jour la vue pour référencer les colonnes renommées, mais je dois connaître la structure actuelle de la vue avant de commencer à fouiller. Comment puis-je récupérer exactement la structure de la vue une fois qu'elle est cassée? J'ai essayé

SHOW CREATE VIEW object_6

mais je reçois la même erreur.

Merci d'avance pour votre aide!

21
Simon Robb

MySQL:

SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS
WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'v';

reference: La table INFORMATION_SCHEMA VIEWS

Serveur SQL:

USE databasename
GO

EXEC sp_helptext viewName

ou aussi une requête comme celle-ci:

SELECT TABLE_NAME as ViewName,
VIEW_DEFINITION as ViewDefinition
FROM INFORMATION_SCHEMA.Views

où vous pouvez ajouter une WHERE pour ne récupérer qu'une vue

26
Davide Piras

Supprimez simplement la vue avec "drop view object_6", puis allez dans le backend pimcore et sauvegardez à nouveau la classe. La vue est ensuite régénérée automatiquement. 

5
Ben

Dans mon cas, le coupable était d'utiliser ORDER BY avec un alias causant le problème. J'ai changé d'avis de:

CREATE VIEW v_storename_totalnamelength AS
SELECT
  (char_length(`a`.`ExtractedLongName`) + char_length(`a`.`ExtractedLongName`)) AS `TotalNameLength`
FROM
  `promoter`.`v_storename_extracted` `a`
ORDER BY
  `TotalNameLength` DESC
;

à:

CREATE VIEW v_storename_totalnamelength AS
SELECT
  (char_length(`a`.`ExtractedLongName`) + char_length(`a`.`ExtractedLongName`)) AS `TotalNameLength`
FROM
  `promoter`.`v_storename_extracted` `a`
ORDER BY
  (char_length(`a`.`ExtractedLongName`) + char_length(`a`.`ExtractedLongName`)) DESC
;
0
Nae