如何修复损坏的 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】:

在我的例子中,罪魁祸首是使用带有 aliasORDER 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 视图的主要内容,如果未能解决你的问题,请参考以下文章

如何修复损坏的MySQL数据表

如何修复损坏的MySQL数据表

SQL 2008 可疑状态,数据库好像损坏了

如何阻止谷歌云 sql 损坏数据库表

xlsx文件损坏如何修复(xls文件损坏怎么修复)

如何修复 SQL 数据库置疑