Как исправить разбитое представление SQL
Я использую open source CMS pimcore (http://www.pimcore.org), который работает на бэкэнде MySQL.
Он использует довольно сложные представления для представления объектов, и один из них был сломан на каком-то этапе, когда столбец в другой таблице, на который ссылается представление, был переименован. Всякий раз, когда я пытаюсь взаимодействовать с таблицей с помощью команд SQL, я получаю сообщение об ошибке:
View 'barriste_website.object_6' ссылается на неверные таблицы (таблицы) или столбец (столбцы) или функция (функции) или определитель /invoker of view не имеют прав на использование их
Я хотел бы просто обновить представление, чтобы ссылаться на переименованные столбцы, но мне нужно знать текущую структуру представления, прежде чем я начну прокручивать - как именно я получаю структуру представления после ее разбиения? Я пробовал
SHOW CREATE VIEW object_6
но я получаю ту же ошибку.
Спасибо за вашу помощь заранее!
Ответы
Ответ 1
MySQL
SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS
WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'v';
ссылка: Таблица видов информации INFORMATION_SCHEMA
SQL Server:
USE databasename
GO
EXEC sp_helptext viewName
а также такой запрос:
SELECT TABLE_NAME as ViewName,
VIEW_DEFINITION as ViewDefinition
FROM INFORMATION_SCHEMA.Views
где вы можете добавить WHERE
только для получения одного вида
Ответ 2
Просто удалите представление с помощью "dropview object_6", затем зайдите в бэкэнд pimcore и снова сохраните класс. Затем представление автоматически восстанавливается.
Ответ 3
В моем случае виновником было использование ORDER BY
с псевдонимом, вызывающим проблему. Я изменил свое мнение с:
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
;