2012-07-13 28 views
5

Tengo un sitio web para uso interno que rastrea un montón de estadísticas para los empleados. Uno de estos es si les faltan informes. Como la lista de elementos que aún no tienen informes solo se actualiza cada dos días, y hay un período de gracia de 3 días en estos informes, estoy comparando la Fecha (releaseDt) en la que se registró el elemento como falta un informe en el informe. la última vez que se actualizó la base de datos (@lastupdate). De esta manera, si la base de datos de informes no se ha actualizado pero el informe está completo, el sitio web no está denunciando a alguien por perder un informe.Permiso para acceder a sys.dm_db_index_usage_stats

El código SQL funciona bien con los privilegios de nivel de administrador, pero por razones obvias no estoy dejando que la cuenta ASP.NET tenga nivel de administrador del servidor.

He configurado una cuenta SQL que utiliza el código ASP.NET C# para iniciar sesión, y los permisos para todo lo demás están bien. (Acceso de lectura solo para las bases de datos específicas que utiliza.) No puedo averiguar a qué darles acceso para tener acceso a esta vista de gestión dinámica específica.

Agradecería sugerencias utilizando Management Studio o utilizando una declaración SQL GRANT.

esto parece haber información asociada a la vista de que se trate:

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 
+2

Para una claridad pedante, es una 'vista de gestión dinámica', no una' tabla de sistema'. –

+0

Corregido eso. – sylverfyre

+0

Claro, no creo que el código o la historia de fondo sean relevantes tampoco; la pregunta podría ser de una o dos líneas sin perder ningún significado. –

Respuesta

11

No puede conceder SELECT en DMV, ya que esto es impedido por la política de DMV servidor de ámbito:

GRANT SELECT ON sys.dm_db_index_usage_stats TO peon; 

resultados en:

Msg 4629, nivel 16, estado 10, línea 1
Los permisos en las vistas de catálogo del ámbito del servidor o procedimientos almacenados del sistema o procedimientos almacenados extendidos se pueden otorgar solo cuando la base de datos actual es maestra.

El BOL page you referenced indica que debe otorgar VIEW SERVER STATE. Lo aplicaría al inicio de sesión desde el maestro:

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

Pero no hay una forma de hacerlo por base de datos. No es que deba preocuparse demasiado, ya que incluso si alguien pudiera descubrir cómo piratear su servidor con las credenciales de la cuenta ASP.NET, todo lo que pueden hacer es ver el estado del servidor, no pueden cambiar nada.

+0

Suena bien, lo intenté, pero mi inicio de sesión de administrador (que tiene el rol 'sysadmin' del servidor - simplemente doblemente comprobado - da el error' El otorgante no tiene permiso GRANT ' – sylverfyre

+1

@sylverfyre ¿Qué significa esto? 'SELECT nombre_permiso FROM sys.fn_my_permissions (NULL, N'server '); '(No los liste en un comentario, pero ¿cuántas filas hay, y hay cosas importantes como' ALTER ANY LOGIN' missing?) –

+0

Sí, no 'ALTER ANY LOGIN' Odd , porque cuando miro el menú correspondiente en el estudio de gestión, tengo 'ALTER ANY LOGIN', así como todos los demás, como' ALTER ANY CREDENTIAL', etc. – sylverfyre

Cuestiones relacionadas