我的数据库架构具有“锁定”设置,这意味着一旦设置了该条目就无法更改。
在设置锁定标志之前,我们可以更新其他属性。所以:
或
编辑:你如何结合更新&检查一个SQL语句?
答案 0 :(得分:6)
你应该两个都做。数据库应使用更新触发器来确定是否可以更新行 - 这将阻止任何人意外地更新后台中的行。应用程序应检查是否应该能够更新行并相应地执行操作。
答案 1 :(得分:1)
“你如何将更新和检查合并到一个SQL语句中?”
update table
set ...
where key = ...
and locked ='N';
这不会引发错误,但会更新0行 - 您应该能够在更新后测试。
至于哪个更好,我认为如果这个锁定标志很重要,那么:
答案 2 :(得分:0)
我会检查代码中的锁定标志,然后(假设记录未锁定)运行更新查询,同时在查询中设置锁定标志。这样它就可以包装在一个事务中并一次性提交/回滚。
答案 3 :(得分:0)
如果您的DBMS提供此功能来强制执行该标志,我会使用触发器。如果设置了标志,则所有更新都会失败。
然后您可以创建一个更新标志的特殊查询。您的触发器可以检查调用更新的内容,并在必要时允许标志回退。这样,无论TSQL是好还是恶意,一旦设置了标志,没有人可以更新你的行。
答案 4 :(得分:0)
根据经验,我总是更愿意检查代码中的所有内容,并考虑在此之后编写数据库约束。让数据库对你执行一致性检查很酷,而且比你在代码中执行它更快,但是你在数据库中加入一些逻辑并且需要付出一些代价。这些约束可能会依赖于供应商,更糟糕的是,您是否可以在开发环境中对这些限制执行自动化测试?
所以我考虑将这种检查作为一个额外的安全网放在数据库中,但不会单独依赖它们。