从表中删除记录时的前或后检查

时间:2012-06-08 14:06:12

标签: asp.net sql sql-server

对于经常删除记录的Web应用程序,如果我们考虑性能,最好的是什么?

  • 检查记录是否与其他表有任何关联,并阻止用户删除。

    例如:查询将是这样的

     if not exist(select * from table1 where tableX_id = @id) and 
           not exist(select * from table2 where tableX_id = @id)
           ...
        then 
           delete from tableX where id = @id 
    

  • 执行delete并由于foriegn key约束而让RDBMS rais出错

      try{
           Service.DeleteRecord(id)
      }catch{
           Handle the error here
      }
    

    在这种情况下,查询将是简单的

     delete from TableX where id = @id
    

3 个答案:

答案 0 :(得分:3)

我会使用数据库触发器(或ON CASCADE DELETE)来处理任何关系 - 可用的工具将取决于您的RDBMS。

答案 1 :(得分:3)

如果目标是仅在实际运行删除会因其它表引用而导致错误的情况下阻止删除行,那么我建议您在让SQL Server检查之前检查违规。 I've done some testing on this and letting SQL catch the error or just using TRY/CATCH can be more expensive if you expect even a moderate amount of failures。有了适当的指标,执行检查的额外成本可以忽略不计;然而,不做检查的成本肯定是微不足道的。

答案 2 :(得分:1)

显然,执行删除并让RDBMS处理业务。通过自己实施检查,您将进行RDBMS将执行的额外操作。