在非托管编程模式中工作的最佳实践是什么?

时间:2010-08-04 09:11:32

标签: sql database programming-languages constraints

我有一个查询

UPDATE dbo.M_Room
 SET

 //do something
WHERE PK_RoomId= @RoomId AND IsActive=1 AND FK_DepartmentId =@DepartmentId

现在假设PK_RoomId是我的M_Room的Pk并且是自动增量字段。 所以根据这个我可以使用

WHERE PK_RoomId= @RoomId

而不是

WHERE PK_RoomId= @RoomId AND IsActive=1 AND FK_DepartmentId =@DepartmentId

如果我使用第二个条件而不是第一个条件,我可以克服的所有威胁。 如果我们没有任何关系/约束(PK,FK等),由于数据库的非托管结构,物理上存在并且无法实现。

在这种情况下,您的建议是什么? 应该做些什么来保持数据的一致性。

2 个答案:

答案 0 :(得分:0)

我认为将WHERE更改为WHERE PK_RoomId= @RoomId不是一个好主意。第一部分(您要保留的部分)用于识别记录。第二部分(AND IsActive=1)用于根据房间是否活动来限制更新。关于最后一部分(AND FK_DepartmentId =@DepartmentId),这可能意味着有时您只想更新房间,如果它属于您指定的部门。这也很有用。

为什么要更改查询?

答案 1 :(得分:0)

如果您正在使用READ-UNCOMMITTED交易或根本没有交易,或者数据长时间位于某人的屏幕上,附加条件可以使您免于埋藏更新,假设您执行某些操作对IsActive专栏做了一些事情。

它也可能是一个最后的防范,只是出错了(看看房间是否活跃,然后忘记利用这个事实)。

确保检查两种情况下更新的行数。

你的倒数第二段表明room_id可能不是唯一的;如果是这样的话,你总会遇到麻烦。

我自己,如果我怀疑它们可能会发生,我会倾向于明确检查埋藏的更新,并且我认为防止编程错误的形式是不寻常的。