Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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_Sql Server_Tsql_Sql Server 2008 - Fatal编程技术网

Sql 防止更新的最佳方法

Sql 防止更新的最佳方法,sql,sql-server,tsql,sql-server-2008,Sql,Sql Server,Tsql,Sql Server 2008,我遇到了这样一种情况,即我们希望防止针对特定场景更新表 因此,对于95%的更新,我希望更新能够正常进行,并更新所需的字段……对于另外5%的更新,我希望防止更新发生。这将基于更新中传递的数据以及表中当前填充的内容 因此,一个很好的例子是用户提交了他们今天的时间。如果他们重新提交时间,我不希望DB允许进行更新,因为该用户的时间表已标记他们已提交时间,并且时间字段不为空 我在玩触发器,它似乎代替触发器将允许我处理这个…基本上只让更新发生,如果该标准成立 有什么想法吗?我很欣赏你的想法 (如果清楚,请告

我遇到了这样一种情况,即我们希望防止针对特定场景更新表

因此,对于95%的更新,我希望更新能够正常进行,并更新所需的字段……对于另外5%的更新,我希望防止更新发生。这将基于更新中传递的数据以及表中当前填充的内容

因此,一个很好的例子是用户提交了他们今天的时间。如果他们重新提交时间,我不希望DB允许进行更新,因为该用户的时间表已标记他们已提交时间,并且时间字段不为空

我在玩触发器,它似乎代替触发器将允许我处理这个…基本上只让更新发生,如果该标准成立

有什么想法吗?我很欣赏你的想法

(如果清楚,请告诉我)

编辑:很抱歉……这可能不是一个好例子。我们重用一个更新存储过程来执行许多不同的更新,因此它是相当通用的。我想弄清楚,对于那些我不希望执行更新的情况,最好的方法是什么。使用触发器基本上是一种保护措施,以防止有人意外地覆盖以前输入的数据。谢谢你的意见

**EDIT2:*谢谢大家……仔细考虑后,Martin是对的,我应该将逻辑构建到存储过程中。有人告诉我他们想用触发器来处理这个问题,但你们都是对的……这不是处理这个问题的正确方法。再次感谢你的帮助

谢谢


S

这不需要触发器。e、 差不多

UPDATE Users 
 SET timefield = @timefield
WHERE UserId = @UserId AND [Day]=@day AND timefield IS NULL

这对你的例子很有用。然后,您可以检查受影响的行,以查看是否有任何内容被实际更新。

因此,如果我错误地键入“16”而不是“8”,我将无法更正我的时间?这种逻辑实际上属于您的应用程序层,而不是数据库。如果您坚持db方法,按照kekekala的建议创建一个sp来封装逻辑,并按照Martin Smith的建议使用一个智能编写的更新语句,这将是一个很好的解决方案。老实说,您的编辑并没有让事情变得更清楚。“重用更新存储过程”是什么意思?您有一个更新不同表的通用过程?对-只需将您的业务规则构建到非数据库抽象层,或者这种SQL语法就可以了,特别是在SP中(业务规则的另一个有用位置);只是不要进入触发器。