Utilizamos LINQ para que las entidades escriban entradas en una base de datos de auditoría (SQL Server 2008). Dado que esta es una base de datos de auditoría dedicada, solo inserta filas: nunca leemos las filas, las actualizamos o las eliminamos de la aplicación de auditoría.Las inserciones de Entify Framework requieren Seleccionar permisos
La aplicación de auditoría debe utilizar el principio de Privilegio mínimo, por lo que no deseamos otorgarle más permisos de los que necesita. Como nunca leemos ninguna fila, no deseamos otorgar permisos para seleccionar desde la base de datos.
Sin embargo, cuando se intenta escribir los datos, obtenemos este mensaje de error:
El permiso SELECT fue denegado en el objeto 'AuditEvent', base de datos 'IdentifyAudit', esquema 'dbo'.
El código es el código EF bastante estándar:
var auditEvent = new AuditEvent();
auditEvent.EventType = eventType;
auditEvent.Timestamp = timestamp;
auditEvent.UserName = userName;
auditEvent.ApplicationId = this.ApplicationId;
this.objectContext.AddToAuditEvents(auditEvent);
this.objectContext.SaveChanges();
¿Por qué necesitamos el permiso SELECT para escribir en la tabla, y lo más importante: ¿hay alguna manera podemos eliminar ese requisito?
EDITAR
de SQL muestra esta declaración en ejecución:
exec sp_executesql N'insert [dbo].[AuditEvent]([EventType], [Timestamp], [UserName], [ApplicationId])
values (@0, @1, @2, @3)
select [Id]
from [dbo].[AuditEvent]
where @@ROWCOUNT > 0 and [Id] = scope_identity()',N'@0 nvarchar(10),@1 datetimeoffset(7),@2 nvarchar(11),@3 nvarchar(36)',@0=N'UpdateUser',@1='2009-11-10 10:58:33.2814740 +01:00',@2=N'foo',@3=N'bar'
Esto explica por qué se necesitan permisos SELECT, ya que la operación devuelve el identificador de auto-generado de la fila insertada
La pregunta ahora sigue siendo: no necesito saber la ID de la fila que acabo de insertar, entonces ¿hay alguna manera de que pueda desactivar esta función?
¿Qué muestra SQL Profiler? –
Pregunta editada para incluir datos del Analizador de SQL. –