在 SQL 脚本中处理错误主要通过数据库系统提供的错误检查函数、事务控制和结构化异常处理机制来完成。大多数 SQL 方言,例如 T-SQL (SQL Server) 或 PL/pgSQL (PostgreSQL),包含 TRY...CATCH
块或 EXCEPTION
处理器等结构,用于在脚本执行期间捕获和管理错误。这些工具允许开发者定义自定义的错误响应,例如回滚事务、记录详细信息或提供用户友好的消息。此外,内置函数如 @@ERROR
(SQL Server) 或 SQLSTATE
(PostgreSQL) 有助于识别特定的错误代码,从而可以根据遇到的错误类型执行条件逻辑。
例如,在 SQL Server 中,TRY...CATCH
块可以包裹一组语句来拦截错误。如果在 TRY
块内发生错误,控制会跳转到 CATCH
块,您可以在其中使用 ERROR_MESSAGE()
或 ERROR_SEVERITY()
等函数访问错误详细信息。以下是一个基本示例:
BEGIN TRY
INSERT INTO Employees (Name, Department) VALUES ('John', 'Sales');
-- Intentional error: inserting duplicate key
INSERT INTO Employees (ID, Name) VALUES (1, 'Jane');
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE() AS ErrorMessage;
ROLLBACK TRANSACTION;
END CATCH;
在这种情况下,第二个 INSERT
违反了主键约束,触发了 CATCH
块来显示错误消息并回滚所有更改。MySQL 使用不同的方法,通过 DECLARE HANDLER
语句为特定错误代码定义操作,例如继续执行或记录日志后退出。
最佳实践包括使用事务确保数据一致性,记录错误以便调试,并彻底测试错误场景。始终将修改数据的操作包裹在事务中,这样如果发生错误就可以 ROLLBACK
。例如,如果脚本在账户之间转移资金,提款和存款必须同时成功或同时失败。将错误记录到带有时间戳、错误代码和消息的专用表中,有助于诊断生产环境中的问题。测试应模拟边缘情况,如无效输入或约束违反,以验证错误处理是否按预期工作。例如,故意将无效数据插入到具有严格约束的表中,可以确保您的脚本优雅地处理错误而不是崩溃。