首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Entify框架插入需要选择权限

Entify框架插入需要选择权限
EN

Stack Overflow用户
提问于 2009-11-10 08:54:47
回答 2查看 2.3K关注 0票数 11

我们使用LINQ实体将条目写入审计数据库( Server 2008)。因为这是一个专用的审计数据库,所以我们只插入行--我们从不从审计应用程序中读取任何行、更新或删除它们。

审核应用程序应该使用最小特权的原则,因此我们不希望授予它比它所需要的更多的权限。因为我们从不读取任何行,所以我们不希望授予从数据库中选择的权限。

但是,当我们试图写入数据时,我们会得到以下错误消息:

对象“AuditEvent”、数据库“身份审计”、架构“dbo”上的SELECT权限被拒绝。

该代码是相当标准的EF代码:

代码语言:javascript
复制
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显示正在执行的此语句:

代码语言:javascript
复制
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,那么有什么方法可以关闭这个特性吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-10 11:44:08

默认情况下,在将实体添加到ObjectContext并调用SaveChanges之后,该对象的状态将从添加更改为不变,ObjectContext仍然会跟踪它。这就是为什么EF需要这个ID,以便能够跟踪它上的变化。

实体键和添加的对象:

1.构造实体对象。此时,键属性都具有默认值,要么为null,要么为0。 2.通过在上下文中调用AddObject或特定于实体集的add方法,或者通过对返回EntityCollection的导航属性调用Add,将新对象添加到EntityCollection中。 此时,objects生成一个临时密钥,用于将对象存储在ObjectStateManager中。 3.在ObjectContext上调用SaveChanges。 INSERT语句由实体服务生成,并在数据源上执行。 4.如果插入操作成功,服务器生成的值将被写回ObjectStateEntry。 5. ObjectStateEntry用服务器生成的值更新对象. 6.当在AcceptChanges上调用ObjectStateEntry时,使用新服务器生成的值计算永久EntityKey。

因此,据我所知,不可能从ObjectContext中切换此特性,而且我也没有看到任何解决这个问题的“很好”的解决方案:您可以避免这种情况的一种方法是使用您自己的存储过程插入实体(如果可以的话) (http://msdn.microsoft.com/en-us/library/bb399203.aspx)。

另外,如果没有服务器生成的id,我认为select查询将不会被执行(同样,如果您可以更改dbs,如果您想麻烦地生成id的话)。

票数 9
EN

Stack Overflow用户

发布于 2014-02-13 06:14:56

然而,这是一个古老的问题,但对于未来,也许任何人都会使用。一种方法是只对id字段授予select权限。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1706484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档