sql-server - 如果条目是通过在多个表中输入数据的存储过程进行的,如何从表中恢复数据
问题描述
如果通过在多个表中输入数据的存储过程进行输入,但在一个表中输入数据时出现错误,如何从表中恢复数据。所以现在我也必须从其他表中恢复数据。怎么做?
解决方案
使用显式事务和TRY...CATCH
. 这是一个基本示例,但演示了这个想法:
--Create Sampel tables
CREATE TABLE dbo.SampleTable1 (ID int IDENTITY PRIMARY KEY,
SomeString varchar(20));
GO
CREATE TABLE dbo.SampleTable2 (ID int IDENTITY PRIMARY KEY,
fID int,
SomeInt int);
ALTER TABLE dbo.SampleTable2 ADD CONSTRAINT FK_Sample2Sample1 FOREIGN KEY (fID) REFERENCES dbo.SampleTable1 (ID);
GO
--Workign sample
BEGIN TRY
BEGIN TRANSACTION YourTransaction;
INSERT INTO dbo.SampleTable1 (SomeString)
VALUES('abc123');
INSERT INTO dbo.SampleTable2 (fID, SomeInt)
VALUES(1,2);
COMMIT TRANSACTION YourTransaction;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION YourTransaction;
THROW;
END CATCH;
GO
--Failing example
BEGIN TRY
BEGIN TRANSACTION YourTransaction;
INSERT INTO dbo.SampleTable1 (SomeString)
VALUES('def456');
INSERT INTO dbo.SampleTable2 (fID, SomeInt)
VALUES(3,2); --Invalid foreign key
COMMIT TRANSACTION YourTransaction;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION YourTransaction;
THROW;
END CATCH;
GO
SELECT * --Notice ID 2 missing.
FROM dbo.SampleTable1;
GO
DROP TABLE dbo.SampleTable2;
DROP TABLE dbo.SampleTable1;
推荐阅读
- ruby - 简化 `if then` 块
- python - 如何使用 python 在 html 代码中定位 td 类?
- sql - Oracle-Join 多次使用不同的 where 条件与同一个表
- python - 检测由不同颜色组成的水下门
- python - 使用 python kivy 构建应用程序时出现错误
- listview - 在 uwp 中,当我在 c# 代码中更改数据时,它不会在前视图上更新
- python - Kivy,在Android中检测倾斜设备
- ruby - 红宝石中的数字1e18是什么意思
- netbeans - Netbeans 自动完成、搜索和其他功能不起作用
- javascript - 修复控制台中的减少