我们使用 LINQ to Entities 将条目写入审计数据库 (SQL Server 2008)。由于这是一个专用的审计数据库,我们只插入行——我们从不读取任何行,从审计应用程序中更新或删除它们。
审计应用程序应该使用最小权限的原则,所以我们不希望授予它比它需要的更多的权限。由于我们从不读取任何行,因此我们不想授予从数据库中选择的权限。
但是,当我们尝试写入数据时,会收到以下错误消息:
对象“AuditEvent”、数据库“IdentifyAudit”、模式“dbo”的 SELECT 权限被拒绝。
该代码是非常标准的 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 Profiler 显示正在执行的语句:
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,那么有什么方法可以关闭此功能吗?