我要求只有超级管理员才能修改“实时”数据。
目前,如果普通管理员想要更改实时数据: -
如果我想尝试消除第1步并让旧数据保持有效直到超级用户批准更改,我有哪些选择?
我正在使用ASP.NET MVC和EF4,因此我对围绕EF的解决方案特别感兴趣,这些解决方案可以对我的控制器透明,但我也有兴趣了解数据库层中的解决方案(或者完全不同的背景)
答案 0 :(得分:5)
首先,由于您正在谈论基于角色的活动,我发现很难找到一个不涉及应用程序/业务层的适当解决方案。我相信您的数据访问层应该忽略了超级管理员或普通管理员调用其方法的事实。
在任何情况下,处理此问题的一种方法是创建一个PendingChanges表并使用一个标志来保存普通管理员对其的更改,该标志表明它正在等待批准。然后,一旦超级管理员批准它,您就将记录从PendingChanges复制到实时表中。
答案 1 :(得分:1)
我将尝试给出一个简单的对象图示例。
考虑一个具有以下结构的博客。
Posts
PostID
Title
Description
PostUpdates
PostUpdateID
PostID
Title
Description
DateUpdated
UpdatedBy
ApprovedBy
PostStatus(Approved/Rejected)
这里我的逻辑是显示Post以及它的Last Update和Approved PostUpdate。现在在这种情况下,实际上没有任何修改过。始终会附加一组新更改,您可以决定删除旧版本。
对于Save,您在PostUpdates中添加一个新的PostUpdate条目。
对于超级管理员,您可以显示所有更新并让他批准正确的更新。当管理员决定批准更新时,将使用上次批准的PostUpdate的内容修改帖子。
另一种选择(更通用)
您可以按照以下方式创建表格,
RowUpdates
RowUpdateID
TableName
TableKey
NewValues (kind of XML store to save which fields were modified)
UpdatedBy
ApprovedBy
DateUpdated
UpdateStatus (Approved/Rejected)
但是在这种情况下,您将不得不使用反射来避免将值存储到DB,而是创建新的RowUpdate条目,并且只有在管理员批准它时,才应在执行反射映射后将实际值发布到db。