我是新來的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
感謝登錄!