Мы используем LINQ to Entities для записи записей в базу данных аудита (SQL Server 2008). Поскольку это выделенная база данных аудита, мы только вставляем строки - мы никогда не читаем никаких строк, не обновляем и не удаляем их из приложения аудита.
Приложение аудита должно использовать принцип наименьших привилегий, поэтому мы не хотим предоставлять ему больше разрешений, чем необходимо. Поскольку мы никогда не читаем никаких строк, мы не хотим предоставлять разрешения на выбор из базы данных.
Однако, когда мы пытаемся записать данные, мы получаем это сообщение об ошибке:
Отказано в разрешении 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 для записи в таблицу, и, что более важно: есть ли способ отменить это требование?
EDIT
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, потому что операция возвращает автоматически сгенерированный идентификатор вставленной строки.
Теперь остается вопрос: мне не нужно знать идентификатор строки, которую я только что вставил, так есть ли способ отключить эту функцию?