Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在非托管编程模式中工作的最佳实践是什么_Sql_Database_Programming Languages_Constraints - Fatal编程技术网

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

Sql 在非托管编程模式中工作的最佳实践是什么,sql,database,programming-languages,constraints,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_De

我有一个问题

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等),并且由于数据库的非托管结构而无法实现

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

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


为什么您要更改查询?

如果您使用的是未提交的只读事务,或者根本没有事务,或者数据已经在某人的屏幕上停留了很长时间,那么附加条件可能会使您免于隐藏的更新,假定您的//do something对IsActive列有影响

它也可能是防止出错的最后一道防线(看看房间是否处于活动状态,然后忘记利用事实)

确保检查在任何情况下更新的行数

你最后的第二段建议,房间id在应该是唯一的时候可能不是唯一的;如果是这样的话,你总是会遇到麻烦


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

IsActive在这里指的是由用户删除的删除数据,一旦变为非活动状态,就不应上线。正在进行部门间的比较,以确保当前房间属于给定的部门。尽管如此,所有这些价值观都适用于这个部门。UI仅显示特定于部门的房间,并对其执行某些操作。所以我应该在这里使用部门检查吗?我也知道这个房间将属于我正在检查的同一个部门。这是正确的,如果你能确定部门ID将是有效的,你就不必再在查询中检查它了。此外,如果您能确保房间始终处于活动状态,则运行此查询时,也可以删除该检查。+1。这个问题是有效的,即使最终证明不建议采取行动。只要至少有一种方法可以将坏数据放入数据库,您就永远无法解决这个问题。您必须经历清理数据库的痛苦。@adolf:在某些组织下工作时,您无法实施良好的实践。你必须遵循给出的指导方针。由于这些原因,公司通常会因为糟糕的编码实践而从客户那里获得终身维护费用。您可以在任何组织中实施良好的实践。太多人举手放弃了。微妙的坚持通常是关键。