如何修复损坏的 SQL 视图
Posted
技术标签:
【中文标题】如何修复损坏的 SQL 视图【英文标题】:How to fix a broken SQL view 【发布时间】:2011-12-30 08:25:08 【问题描述】:我正在使用在 mysql 后端运行的开源 CMS pimcore (http://www.pimcore.org)。
它使用相当复杂的视图来表示对象,当视图引用的另一个表中的列被重命名时,其中一个在某个阶段已损坏。每当我尝试通过 SQL 命令与表交互时,我都会收到错误消息:
查看“barriste_website.object_6”引用无效表或 列或函数或视图的定义者/调用者缺乏使用权 他们
我想简单地更新视图以引用重命名的列,但在开始查看之前我需要知道视图的当前结构 - 一旦视图结构损坏,我该如何检索视图的结构?我试过了
SHOW CREATE VIEW object_6
但我收到同样的错误。
提前感谢您的帮助!
【问题讨论】:
【参考方案1】:在我的例子中,罪魁祸首是使用带有 alias 的 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
;
【讨论】:
【参考方案2】:只需使用“drop view object_6”删除视图,然后进入 pimcore 后端并再次保存类。然后视图会自动重新生成。
【讨论】:
听起来不是个好主意,删除将删除对 SQL 语句的所有引用,这是在更改引用表中的列名后重构视图所需要的。 我不确定这是否适用于 pimcore,但是我在使用标准 AWS MySQL 数据库时遇到了这个问题,并且删除视图不会自动重新生成它。幸运的是,我有一个视图的副本,发现有一些列被重命名,更新了代码中的名称并执行了视图代码。它自然地创建了正确的视图并解决了问题。【参考方案3】:MySQL:
SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS
WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 'v';
参考:The INFORMATION_SCHEMA VIEWS Table
SQL 服务器:
USE databasename
GO
EXEC sp_helptext viewName
或者也是这样的查询:
SELECT TABLE_NAME as ViewName,
VIEW_DEFINITION as ViewDefinition
FROM INFORMATION_SCHEMA.Views
您可以在其中添加 WHERE
以仅检索一个视图
【讨论】:
谢谢 Davide - 我认为 sp_helptext 只是 MSSQL,我需要 MySQL。以上是关于如何修复损坏的 SQL 视图的主要内容,如果未能解决你的问题,请参考以下文章