我是新来的SQL Server错误处理,我的英文不太清楚,所以我提前道歉,任何误解。SQL SERVER错误处理光标里面的触发器
问题是:我插入多个记录到表中。该表具有一个AFTER INSERT
触发器,该触发器正在使用游标在FETCH WHILE循环中逐个处理记录。如果发生错误,所有事情都会回滚。所以如果在插入的记录中只有一个错误的字段,我就会全部丢失。插入也回滚,所以我找不到错误的记录。所以我需要处理游标内部的错误,只回滚错误的记录。
我与3个表测试数据库:
TA
VarSmallint smallint
VarTinyint tinyint
String varchar(20)
TB
ID int (PK, identity)
Timestamp datetime (default: getdate())
VarSmallint smallint
VarTinyint tinyint
String varchar(20)
的tC
ID int PK
Timestamp datetime
VarTinyint1 tinyint
VarTinyint2 tinyint
String varchar(10)
tA
包含3条记录,1条错误。我将这个内容插入tB
。 tB
具有触发器,并将记录插入到tC
中。
tC
只有tinyint变量,所以插入大于255的值可能会有问题。这是测试错误发生的地方!
我的触发是:
ALTER TRIGGER [dbo].[trg_tB]
ON [dbo].[tB]
AFTER INSERT
AS
BEGIN
IF @@rowcount = 0
RETURN;
SET NOCOUNT ON;
DECLARE
@ID AS int,
@Timestamp AS datetime,
@VarSmallint AS smallint,
@VarTinyint AS tinyint,
@String AS varchar(20),
DECLARE curNyers CURSOR DYNAMIC
FOR
SELECT
[ID], [Timestamp], [VarSmallint], [VarTinyint], [String]
FROM INSERTED
ORDER BY [ID]
OPEN curNyers
FETCH NEXT FROM curNyers INTO @ID, @Timestamp, @VarSmallint, @VarTinyint, @String
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRY
BEGIN TRAN
INSERT INTO [dbo].[tC]([ID], [Timestamp], [VarTinyint1], [VarTinyint2], [String])
VALUES (@ID, @Timestamp, @VarSmallint, @VarTinyint, @String)
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
INSERT INTO [dbo].[tErrorLog]([ErrorTime], [UserName], [ErrorNumber],
[ErrorSeverity], [ErrorState],
[ErrorProcedure], [ErrorLine],
[ErrorMessage], [RecordID])
VALUES (SYSDATETIME(), SUSER_NAME(), ERROR_NUMBER(),
ERROR_SEVERITY(), ERROR_STATE(),
ERROR_PROCEDURE(), ERROR_LINE(),
ERROR_MESSAGE(), @ID)
END CATCH
FETCH NEXT FROM curNyers INTO @ID, @Timestamp, @VarSmallint, @VarTinyint, @String
END
CLOSE curNyers
DEALLOCATE curNyers
END
如果我插入2条1点错了,一切都回滚良好的记录,我得到了一个错误:
Msg 3609, Level 16, State 1, Line 1
The transaction ended in the trigger. The batch has been aborted.
请帮帮我!如何修改此触发器以正常工作?
如果我插入错误的记录,我需要:
- 所有结核病
- 一切美好的记录插入记录的tC
- 错误tErrorLog
感谢登录!