我们使用LINQ to Entities将条目写入审计数据库(SQL Server 2008)。由于这是一个专用的审计数据库,我们只需插入行 - 我们从不读取任何行,从审计应用程序更新或删除它们。Entify框架插入需要选择权限
审计应用程序应该使用最小特权原则,所以我们不希望授予它超出它所需的权限。由于我们从不读取任何行,因此我们不希望授予从数据库中进行选择的权限。
然而,当我们尝试写入的数据,我们得到这个错误信息:
的SELECT权限是在对象AuditEvent'数据库“IdentifyAudit”,架构“DBO”拒绝。
的代码是非常标准的EF代码:
var auditEvent = new AuditEvent();
auditEvent.EventType = eventType;
auditEvent.Timestamp = timestamp;
auditEvent.UserName = userName;
auditEvent.ApplicationId = this.ApplicationId;
this.objectContext.AddToAuditEvents(auditEvent);
this.objectContext.SaveChanges();
为什么我们需要SELECT权限写入表,更重要的是:有什么办法能去掉这一要求?
编辑
SQL事件探查器显示了这个正在执行的语句:
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'
这就解释了为什么需要 SELECT权限,因为操作返回的自动生成的ID插入的行。
现在问题仍然存在:我不需要知道刚插入的行的ID,那么有什么办法可以关闭此功能吗?
SQL事件探查器显示什么? – 2009-11-10 08:56:47
编辑问题以包含SQL事件探查器数据。 – 2009-11-10 10:19:57