Anasayfa | Hakkımda | Kitaplarım | RSS Site içinde
Kategoriler
» SQL Server 2012
» SQL Server 2008
» C#
» MySQL
» Hayata Dair
» Güncel Haber-Duyuru
» Bir Soru Bir Cevap
» Oracle ve Diğer VTYS
» Java

XACT_ABORT ve Dahili Hataları Yok Saymak

01.05.2011 00:00:00
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.


Konuya müdahil olmak ister misiniz?
Başlık:  
İsim  :  
URL   :
Yorum