Подтвердить что ты не робот

Как исправить разбитое представление SQL

Я использую open source CMS pimcore (http://www.pimcore.org), который работает на бэкэнде MySQL.

Он использует довольно сложные представления для представления объектов, и один из них был сломан на каком-то этапе, когда столбец в другой таблице, на который ссылается представление, был переименован. Всякий раз, когда я пытаюсь взаимодействовать с таблицей с помощью команд SQL, я получаю сообщение об ошибке:

View 'barriste_website.object_6' ссылается на неверные таблицы (таблицы) или столбец (столбцы) или функция (функции) или определитель /invoker of view не имеют прав на использование их

Я хотел бы просто обновить представление, чтобы ссылаться на переименованные столбцы, но мне нужно знать текущую структуру представления, прежде чем я начну прокручивать - как именно я получаю структуру представления после ее разбиения? Я пробовал

SHOW CREATE VIEW object_6

но я получаю ту же ошибку.

Спасибо за вашу помощь заранее!

4b9b3361

Ответ 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
;