【问题标题】:Check Compiled views in SQL Server 2005检查 SQL Server 2005 中的已编译视图
【发布时间】:2018-03-29 13:31:14
【问题描述】:

我的 SQL Server 数据库中有超过 1000 个视图,但有些视图有错误,因为视图中使用的表已被重命名,因此出现错误,这很好。

我的问题是:我需要检查哪些视图是有效的并且可以成功使用。

【问题讨论】:

  • 重命名表而不更正所有视图和存储过程的人需要当场解雇
  • 你知道哪些表被重命名了吗?如果你这样做,你可以使用 redgate 的 SQL 搜索。这是一个可以提供帮助的免费工具。
  • 您也可以利用一些动态 sql 和 sys.views。底线是您将不得不手动完成此操作并找出损坏的地方。
  • 可能值得浏览所有视图并添加WITH SCHEMABINDING。停止视图所依赖的表/列的任何重命名,因此您以后不会再遇到这种情况。

标签: sql-server sql-server-2005


【解决方案1】:

如果您知道哪些表已被重命名并且只有少数,您可以像这样搜索使用旧表名的每个对象:

SELECT DISTINCT
       o.name AS Object_Name,
       o.type_desc,
       m.*
FROM   sys.sql_modules m
  INNER JOIN sys.objects o ON m.object_id = o.object_id
WHERE m.definition Like '%OLD_TABLE_NAME_HERE%';

如果您不知道哪些表已被重命名,您可以尝试使用此脚本查找无效对象,但请注意它可能会返回误报

select QuoteName(OBJECT_SCHEMA_NAME(referencing_id)) + '.' + QuoteName(OBJECT_NAME(referencing_id)) AS ProblemObject,
       o.type_desc,
       ISNULL(QuoteName(referenced_server_name) + '.', '')
         + ISNULL(QuoteName(referenced_database_name) + '.', '')
         + ISNULL(QuoteName(referenced_schema_name) + '.', '')
         + QuoteName(referenced_entity_name) AS MissingReferencedObject
from   sys.sql_expression_dependencies sed
  left join sys.objects o on sed.referencing_id=o.object_id
where  (is_ambiguous = 0)
and  (OBJECT_ID(ISNULL(QuoteName(referenced_server_name) + '.', '')
       + ISNULL(QuoteName(referenced_database_name) + '.', '')
       + ISNULL(QuoteName(referenced_schema_name) + '.', '')
       + QuoteName(referenced_entity_name)
     ) IS NULL)
order by ProblemObject, MissingReferencedObject

编辑
要获取所有有效对象的列表(有效意味着不引用任何不存在的对象),您需要做的就是将最后一个 IS NULL 转换为 IS NOT NULL 像这样

select QuoteName(OBJECT_SCHEMA_NAME(referencing_id)) + '.' + QuoteName(OBJECT_NAME(referencing_id)) AS ProblemObject,
       o.type_desc,
       ISNULL(QuoteName(referenced_server_name) + '.', '')
         + ISNULL(QuoteName(referenced_database_name) + '.', '')
         + ISNULL(QuoteName(referenced_schema_name) + '.', '')
         + QuoteName(referenced_entity_name) AS MissingReferencedObject
from   sys.sql_expression_dependencies sed
  left join sys.objects o on sed.referencing_id=o.object_id
where  (is_ambiguous = 0)
and  (OBJECT_ID(ISNULL(QuoteName(referenced_server_name) + '.', '')
       + ISNULL(QuoteName(referenced_database_name) + '.', '')
       + ISNULL(QuoteName(referenced_schema_name) + '.', '')
       + QuoteName(referenced_entity_name)
     ) IS NOT NULL)
order by ProblemObject, MissingReferencedObject

请注意,这仅列出不引用不存在对象的对象,它们可能由于其他原因仍然无效

编辑
OBJECT_SCHEMA_NAME 在 sql server 2005 中不可用。
您可以在查询中省略该部分,它仍然可以工作,唯一的问题是模式名称(例如 dbo.)将从结果中省略。
如果你所有的对象都在同一个模式中,那当然不是问题

select QuoteName(OBJECT_NAME(referencing_id)) AS ProblemObject,
       o.type_desc,
       ISNULL(QuoteName(referenced_server_name) + '.', '')
         + ISNULL(QuoteName(referenced_database_name) + '.', '')
         + ISNULL(QuoteName(referenced_schema_name) + '.', '')
         + QuoteName(referenced_entity_name) AS MissingReferencedObject
from   sys.sql_expression_dependencies sed
  left join sys.objects o on sed.referencing_id=o.object_id
where  (is_ambiguous = 0)
and  (OBJECT_ID(ISNULL(QuoteName(referenced_server_name) + '.', '')
       + ISNULL(QuoteName(referenced_database_name) + '.', '')
       + ISNULL(QuoteName(referenced_schema_name) + '.', '')
       + QuoteName(referenced_entity_name)
     ) IS NOT NULL)
order by ProblemObject, MissingReferencedObject

【讨论】:

  • 我知道什么表,我有列表,但表大约是 4500,而且太多了。
  • 你能帮我一些事情,我可以得到一个成功的意见列表
  • @MuhammadSaadRoshan 我已经编辑了我的答案。但是这些查询不仅列出了 VIEWS,还列出了其他对象,请不要忘记,在重命名表时,不仅视图,触发器和存储过程也会失效
  • 问题是 OBJECT_SCHEMA_NAME 在 sqlserver 2005 中不起作用
  • 好的,我不知道,抱歉
猜你喜欢
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
  • 1970-01-01
相关资源
最近更新 更多