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 权限?
一些改进。
QUOTENAME()
阻止恶意命名者
添加架构名称,因为架构很重要
使用sys.views
代替sys.objects
(并从输出中删除type
)
限制sys.partitions
为index_id
0 或 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。
归档时间: |
|
查看次数: |
11715 次 |
最近记录: |