用于计算数据库中所有视图的行数的 SQL 脚本,仅具有 SELECT 访问权限

Mel*_*Mel 3 sql-server permissions view count

我需要知道我被授予仅 SELECT 访问权限的第三方数据库中每个视图的行数。以下脚本适用于表,但不适用于视图:

SELECT      SCHEMA_NAME(A.schema_id) + '.' +
        --A.Name, SUM(B.rows) AS 'RowCount'  Use AVG instead of SUM
          A.Name, AVG(B.rows) AS 'RowCount'
FROM        sys.objects A
INNER JOIN sys.partitions B ON A.object_id = B.object_id
WHERE       A.type = 'U'
GROUP BY    A.schema_id, A.Name
Order by AVG(B.rows) desc
GO
Run Code Online (Sandbox Code Playgroud)

我在网上查看过,但所有建议要么仅适用于表,要么要求我创建表或过程(我无法使用此级别的权限来执行此操作),要么要求我单独计算每个视图的行数,这是不可行的对于包含大量此类视图的数据库。

有谁对一个脚本有什么想法,该脚本可以计算数据库中所有视图中的所有行,而不需要 CREATE 或 EXECUTE 权限?

Aar*_*and 5

一些改进。

  • QUOTENAME()阻止恶意命名者

  • 添加架构名称,因为架构很重要

  • 使用sys.views代替sys.objects(并从输出中删除type

  • 限制sys.partitionsindex_id0 或 1,以防止在索引视图具有附加非聚集索引的情况下出现重复计数(不确定您认为AVG会实现什么 - 如果存在具有非聚集筛选索引的索引视图怎么

  • 使用动态SQL,避免手动复制/手动粘贴/手动按摩/手动运行

      DECLARE @sql nvarchar(max) = N'';
    
      SELECT @sql += N'UNION ALL 
      SELECT ' 
        + 'N''' + QUOTENAME(s.name) + N'.' + QUOTENAME(v.name) + N''',
        FromMetadata = ' + CONVERT(varchar(11),COALESCE(SUM(p.rows),0)) + N',
        TheHarderWay = COUNT(*) FROM ' 
        + QUOTENAME(s.name) + N'.' + QUOTENAME(v.name) + N'
      '
      FROM sys.views AS v
      INNER JOIN sys.schemas AS s
      ON v.schema_id = s.schema_id
      LEFT OUTER JOIN sys.partitions AS p
      ON v.object_id = p.object_id
      AND p.index_id IN (0,1)
      GROUP BY s.name, v.name
      ORDER BY s.name, v.name;
    
      SET @sql = STUFF(@sql, 1, CHARINDEX(N'SELECT', @sql)-1, N'');
    
      PRINT @sql;
      --EXEC sys.sp_executesql @sql;
    
    Run Code Online (Sandbox Code Playgroud)

请注意,FromMetadata除非视图已建立索引,否则将为 0。