SQL Server如何找出视图依赖的对象和视图嵌套层数

打印 上一主题 下一主题

主题 1002|帖子 1002|积分 3006

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
场景:在SQL Server数据库的SQL优化中,我们有时候会需要找出某个视图的依赖对象,简单的视图倒是很容易一眼就找出依赖对象,一旦遇到一些复杂的视图,如果我们手动整理的话,就相当麻烦了,因为你要一个对象一个对象的捋一遍。相当的耗时耗力,其实这种机械、重复、繁杂的事情就应该让机器(SQL)去处理。我们应该将精力和时间用在关键的地方。所谓好钢要用在刀刃上。所以最好能用一个SQL将视图依赖的对象全部查询出来。下面是我写的一个脚本。
  1. /*-*************************************************************************************************************<br>    --脚本名称  :      get_view_referenced_objects.sql<br>    --脚本作者  :       潇湘隐者<br>    --创建日期  :       2018-06-28<br>***************************************************************************************************************<br>    脚本功能    :       查看View引用/依赖的对象<br>***************************************************************************************************************<br>    注意事项    :       1:执行前修改参数@object_name的值<br>***************************************************************************************************************<br>    脚本参数    :       @object_name  按实际情况填写对应的视图名称<br>***************************************************************************************************************<br>    参考资料    :       无<br>***************************************************************************************************************<br>    更新记录    :      2018-06-28 创建此脚本<br>                       2022-01-06 修改脚本,如果被引用的对象不是跨数据库或跨服务器的对象,<br>                                   那么server_name,database_name为null,修改脚本逻辑。<br>*-**************************************************************************************************************/<br>declare @object_name varchar(128)<br>set @object_name = 'dbo.v_SecPolicyInfo'<br><br>;WITH cte_objects<br>AS<br>(<br>SELECT 1 as  nested_level<br>      ,d.referencing_id<br>      ,d.referenced_id<br>      ,d.referenced_server_name<br>      ,d.referenced_database_name<br>      ,d.referenced_class_desc<br>      ,d.referenced_schema_name<br>      ,d.referenced_entity_name<br>FROM sys.sql_expression_dependencies d<br>WHERE d.referencing_id = object_id(@object_name)<br>UNION ALL<br>SELECT t.nested_level+1 nested_level<br>      ,d.referencing_id<br>      ,d.referenced_id<br>      ,d.referenced_server_name<br>      ,d.referenced_database_name<br>      ,d.referenced_class_desc<br>      ,d.referenced_schema_name<br>      ,d.referenced_entity_name<br>FROM sys.sql_expression_dependencies d<br>INNER JOIN cte_objects t<br>   ON t.referenced_id = d.referencing_id<br>)<br><br>SELECT d.nested_level<br>     , schema_name(o.schema_id) +'.' + o.name as object_name<br>     , o.type_desc <br>     , ISNULL(d.referenced_server_name,@@SERVERNAME) as referenced_server_name<br>     , ISNULL(d.referenced_database_name, DB_NAME()) as referenced_database_name<br>     , d.referenced_class_desc<br>     , ISNULL(d.referenced_schema_name,'dbo') <br>       + '.' +d.referenced_entity_name as referenced_entity_name<br>     , p.type_desc as  referenced_object_type<br><br>FROM cte_objects d<br>INNER JOIN sys.objects o<br>    ON d.referencing_id = o.object_id<br>INNER JOIN sys.objects p<br>    ON d.referenced_id = p.object_id ;<br>
复制代码
场景:有时候,我们在数据库优化或做一些SQL审计的时候,我们需要找出一些嵌套的视图,那么有没有一个现成的SQL语句找出嵌套视图呢?我自己写过一个SQL,但是How to query metadata to discover nested views中的SQL比我写的要好,分享如下(下面脚本来源于参考资料):
  1. /*-*************************************************************************************************************<br>    --脚本名称  :      get_netsted_view_level.sql<br>    --脚本作者  :       Fredrik Rundgren<br>    --创建日期  :       2018-04-15<br>***************************************************************************************************************<br>    脚本功能    :      找出数据库视图嵌套视图的视图/嵌套超过2层的视图。<br>***************************************************************************************************************<br>    注意事项    :       此脚本来自下面参考资料。<br>***************************************************************************************************************<br>    脚本参数    :       无参数<br>***************************************************************************************************************<br>    参考资料    :       https://www.sqlservice.se/how-to-query-metadata-to-discover-nested-views/<br>***************************************************************************************************************<br>    更新记录    :      2018-04-15                    <br>*-**************************************************************************************************************/<br>;WITH cRefobjects<br>AS (<br>    -- Anchor level a view which refers to another view<br>    SELECT DISTINCT sed.referencing_id<br>        ,sed.referenced_id<br>        ,schema_name(o.schema_id) AS SchemaName<br>        ,o.name AS ViewName<br>        ,CONVERT(NVARCHAR(2000), N'>>' + schema_name(o.schema_id) + '.' + o.name) COLLATE DATABASE_DEFAULT AS NestViewPath<br>        ,o.type_desc<br>        ,1 AS LEVEL<br>    FROM sys.sql_expression_dependencies sed<br>    INNER JOIN sys.objects o ON o.object_id = sed.referencing_id<br>        AND o.type_desc = 'VIEW'<br>    LEFT OUTER JOIN sys.objects o2 ON o2.object_id = sed.referenced_id<br>        AND o2.type_desc IN ('VIEW')<br>    WHERE o2.object_id IS NULL<br><br>    UNION ALL<br><br>    -- Recursive part, retrieve any higher level views, build the path and increment the level<br>    SELECT sed.referencing_id<br>        ,sed.referenced_id<br>        ,s.name AS sch<br>        ,o.name AS viewname<br>        ,CONVERT(NVARCHAR(2000), cRefobjects.NestViewPath + N'>' + s.name + '.' + o.name) COLLATE DATABASE_DEFAULT<br>        ,o.type_desc<br>        ,LEVEL + 1 AS LEVEL<br>    FROM sys.sql_expression_dependencies AS sed<br>    INNER JOIN sys.objects o ON o.object_id = sed.referencing_id<br>        AND o.type_desc = 'VIEW'<br>    INNER JOIN sys.schemas AS s ON s.schema_id = o.schema_id<br>    INNER JOIN cRefobjects ON sed.referenced_id = cRefobjects.referencing_id<br>    )<br>SELECT DISTINCT SchemaName + '.' + ViewName AS ViewName<br>    ,NestViewPath<br>    ,type_desc<br>    ,LEVEL<br>FROM cRefobjects<br>WHERE LEVEL > 1<br>ORDER BY LEVEL DESC<br>    ,viewname<br>OPTION (MAXRECURSION 32);<br>
复制代码
扫描上面二维码关注我如果你真心觉得文章写得不错,而且对你有所帮助,那就不妨帮忙“推荐"一下,您的“推荐”和”打赏“将是我最大的写作动力!本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万有斥力

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表