【发布时间】:2014-05-28 05:29:30
【问题描述】:
我正在编写一个脚本,该脚本将从多个表中删除记录,但在删除之前它必须返回一个计数以供用户在提交前确认。
这是脚本的摘要。
BEGIN TRANSACTION SCHEDULEDELETE
BEGIN TRY
DELETE -- delete commands full SQL cut out
DELETE -- delete commands full SQL cut out
DELETE -- delete commands full SQL cut out
PRINT 'X rows deleted. Please commit or rollback.' --calculation cut out.
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage
ROLLBACK TRANSACTION SCHEDULEDELETE
PRINT 'Error detected, all changes reversed.'
END CATCH
--COMMIT TRANSACTION SCHEDULEDELETE --Run this if count correct.
--ROLLBACK TRANSACTION SCHEDULEDELETE --Run this if there is any doubt whatsoever.
这是我第一次编写事务,将 TRY/CATCH 块放在事务中是否正确/最佳做法,还是应该将事务放在 TRY 块中?
此脚本中的重要因素是用户必须手动提交事务。
【问题讨论】:
-
是的,在 try/catch 块之外。
-
永远不要等待最终用户提交事务,除非它是单用户模式数据库。
-
@dean 有问题吗?基本上,用户将被告知他们应该期望删除 X 条记录,如果数量匹配,则立即提交。事务运行时不会写入这些表(尽管其他表会写入)。
-
我赞同@dean 所说的话。除非您的用户在这类事情上有一定的经验,否则您将陷入困境。即便如此,用户错误迟早会发生。如果可能的话,最好只填补您拥有的任何信息空白,从而防止您首先创建可靠的脚本。如果绝对有必要在提交之前确认结果,那么我建议默认情况下将脚本置于回滚状态。但即使这样也不是很好的做法。
-
如果他们事先知道受影响的记录数应该是多少,那么最好在匹配时使用参数提交(并且没有发现错误),并在不匹配时使用原因和输出回滚。从长远来看,最好为用户错误和临时疏忽留出尽可能少的空间,您可以更好地自动化这些事情,它们往往越可靠。
标签: sql-server tsql transactions sql-delete