我們使用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