8

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?

+0

¿Qué muestra SQL Profiler? –

+1

Pregunta editada para incluir datos del Analizador de SQL. –

Respuesta

8

De forma predeterminada, después de agregar una entidad al ObjectContext y llamar a SaveChanges, el estado de ese objeto cambia de Added to Unchanged y ObjectContext aún lo sigue. Es por eso que EF necesita esa identificación para que pueda rastrear los cambios en ella.

Entity Keys and added objects:

1.El objeto de entidad se construye. En este punto las propiedades clave todo tienen valores por defecto, ya sea nulos o 0.

2.El nuevo objeto se añade a la ObjectContext ya sea llamando AddObject o uno de la entidad -conjunto específico métodos agrega en el contexto o llamando a Agregar en una propiedad de navegación que devuelve EntityCollection.

En este punto, Servicios de objeto genera una clave temporal, que es utiliza para almacenar los objetos en el ObjectStateManager.

3.SaveChanges se llama en el ObjectContext.

Una declaración INSERT es generada por Entity Services y se ejecuta en la fuente de datos .

4.Si la operación INSERT se realiza correctamente, los valores generados por el servidor se escriben de nuevo en ObjectStateEntry.

5. ObjectStateEntry actualiza el objeto con el valor generado por el servidor.

6. Cuando AcceptChanges se llama en la ObjectStateEntry, una permanente EntityKey se calcula utilizando las nuevas valores generados por el servidor.

Por lo tanto, hasta donde yo sé, no es posible cambiar esta característica de ObjectContext y no veo ninguna solución "agradable" a este problema: una forma de evitar esto es utilizar su poseer procedimientos almacenados para insertar entidad (si puede) (http://msdn.microsoft.com/en-us/library/bb399203.aspx).

Además, si no hay identificadores generados por el servidor, creo que la consulta seleccionada no se ejecutará (de nuevo, si puede cambiar dbs, y si desea molestarse con la generación de id).

3

Sin embargo, esta es una vieja pregunta, pero para el futuro tal vez alguien la use. Una forma es otorgar permisos selectos solo a los campos de id.

Cuestiones relacionadas