SQL Server, herhangi bir çalışma zamanı hatası ile karşılaştığında, Transaction'ın otomatik olarak rollback edilip edilmeyeceğine XACT_ABORT session parametresinin değerine göre karar verir.
SQL Server, herhangi bir çalışma zamanı hatası ile karşılaştığında, Transaction'ın otomatik olarak rollback edilip edilmeyeceğini belirtmeye yarayan XACT_ABORT session parametresi
için genel kullanım şu şekildedir:
SET XACT_ABORT { ON | OFF }
Problem:
Bir paket program üstündeki Trigger loglamaları(veri değişimlerini) kaydetmekte. Fakat, trigger bir hata ile karşılaştığı anda kullanıcının asıl yapmak istediği işlem gerçekleştirilememekte.
Örnek Veritabanı Neseneleri:
CREATE TABLE [tbUrun](
[urunKod] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[urunAd] [varchar](50) NULL,
[listeFiyat] [varchar](50) NULL
)
GO
-- sonra trigger'ı oluşturalım:
CREATE TRIGGER [TR_UD_tblUrun] on tbUrun
FOR UPDATE,DELETE
AS
BEGIN TRY
SELECT 1/0
END TRY
BEGIN CATCH
--EXEC SP_HataMesajiKaydet
END CATCH
Şimdi bir kaç test yapalım:
GO
INSERT INTO tbUrun(urunAd,listeFiyat)
VALUES('abc',123)
-- başarı ile eklenir.
GO
UPDATE tbUrun
SET listeFiyat=456
WHERE urunAd='abc';
-- trigger devreye girdiği ve trigger hata oluşturduğu için çalışmaz!!!!
________________________
(0 row(s) affected)
Msg 3616, Level 16, State 1, Line 1
An error was raised during trigger execution. The batch has been aborted and the user transaction, if any, has been rolled back.
Trigger dışında bir hata yokken, Trigger'da meydana gelecek hataların işlemi engellememesi için düzenleme yaparsak:
ALTER TRIGGER [TR_UD_tblUrun] on tbUrun
FOR UPDATE,DELETE
AS
SET XACT_ABORT OFF;
BEGIN TRY
SELECT 1/0 ;
END TRY
BEGIN CATCH
SELECT
/*
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_LINE () AS ErrorLine
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_MESSAGE() AS ErrorMessage;
*/
END CATCH
SET XACT_ABORT ON;
GO
Aynı testleri tekrarlarsak:
UPDATE tbUrun
SET listeFiyat=456
WHERE urunAd='abc';
SELECT * FROM tbUrun;
----------------------------------
urunKod urunAd listeFiyat
----- ------------- ------------
1 abc 456
Şeklinde gösterecektir.