LINQ to Entities を使用して、エントリを Audit データベース (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 プロファイラーは、このステートメントが実行されていることを示しています。
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'
これは、操作が挿入された行の自動生成された ID を返すため、SELECT 権限が必要な理由を説明しています。
ここで疑問が残ります: 挿入したばかりの行の ID を知る必要はないので、この機能を無効にする方法はありますか?