7

所以我有一个内部使用的网站,它跟踪员工的一堆统计数据。其中之一是他们是否缺少任何报告。由于尚无报告的项目列表仅每两天更新一次,并且这些报告有 3 天的宽限期,因此我将项目记录为缺少报告的日期 (releaseDt) 与上次更新数据库的时间 (@lastupdate)。这样,如果报告数据库尚未更新但报告已完成,则网站不会因为缺少报告而指责某人。

SQL 代码适用于管理员级别的权限,但出于显而易见的原因,我不让 ASP.NET 帐户具有服务器管理员级别。

我已经设置了一个 ASP.NET C# 代码用于登录的 SQL 帐户,其他一切的权限都很好。(仅对其使用的特定数据库的读取访问权限。)我不知道要授予它访问权限的内容,以便有权读取此特定的动态管理视图。

使用 Management Studio 或使用GRANTSQL 语句的建议将不胜感激。

这似乎有关于相关视图的相关信息:

sys.dm_db_index_usage_stats (Transact-SQL)

DECLARE @lastupdate datetime
     SELECT @lastupdate = last_user_update from sys.dm_db_index_usage_stats
     WHERE OBJECT_ID = OBJECT_ID('MissingReport')

SELECT 
    COALESCE(Creator, 'Total') AS 'Creator',
    COUNT(*) AS Number, 
    '$' + CONVERT(varchar(32), SUM(Cost), 1) AS 'Cost' 
    FROM MissingReport 
    WHERE NOT( 
        [bunch of conditions that make something exempt from needing a report]
        OR
        (
            DATEDIFF(day,ReleaseDt,@lastupdate) <= 3
        )
    )
    GROUP BY Creator WITH ROLLUP
4

1 回答 1

13

您不能授予SELECTDMV,因为服务器范围的 DMV 的策略阻止了这一点:

GRANT SELECT ON sys.dm_db_index_usage_stats TO peon;

结果是:

Msg 4629, Level 16, State 10, Line 1
只有当当前数据库是主数据库时,才能授予对服务器范围目录视图或系统存储过程或扩展存储过程的权限。

您引用的BOL 页面告诉您需要授予VIEW SERVER STATE. 您可以将此应用于 master 的登录:

USE master;
GO
GRANT VIEW SERVER STATE TO peon;
-- if it's a Windows login then:
GRANT VIEW SERVER STATE TO [Domain\peon];

但是没有办法为每个数据库执行此操作。并不是说您应该那么担心,因为即使有人知道如何使用 ASP.NET 帐户凭据侵入您的服务器,他们所能做的就是查看服务器状态,他们无法更改任何内容。

于 2012-07-13T15:58:12.897 回答