Makale Özeti

SQL Server 2005'de Yapısal Hata Yakalama Mekanizması

Makale

 

SQL Server 2005 ile gelen yeni bir yapıyı bu makalede beraber inceleyeceğiz.  Transcation içeren  T-SQL ifadelerinde  hata ayıklama çok önemi bir ihtiyaçtır. .NET dillerinde kullanılan TRY….CATCH bloklarını, SQL Server 2005’te de kullanabiliyoruz.

 

BEGIN TRY

                { sql_statement | statement blok}

 

END TRY

BEGIN CATCH

               { sql_statement | statement blok}

END CATCH

 

try_statement veya statement_block  kısmı herhangi T-SQL cümlesini veya cümle bloğunu içerisinde bulundurur.

 

TRY…CATCH blokları yapılandırılmış hata ayıklamayı sağlar.

TRY Bloğu  hata olma olasılığını düşündüğümüz kod bloğunu içerir.

CATCH Bloğu  TRY bloğunda hata oluştuğunda çalışmasını istediğimiz kod bloğunu içerir.

 

SQL Server 2005’te TRY...CATCH bloklarını kullanırken  SET_XACT_ABORT ON komutunu kullanarak rollback transaction seçeneğini aktif hale getirmek gerekir. Bu sayede, TRY bloğundaki tüm hatalar CATCH bloğu tarafından yakalanır ve transaction rollback edilir. Bu blok içerisinde istenirse tüm hata yakalama fonksiyonları kullanabiliriz.

 

Bu fonksiyonlar şunlardır:

  • ERROR_NUMBER() –Hataya atanmış numarayı  gösterir.
  • ERROR_SEVERITY() – Hatanın önem düzeyini gösterir.
  • ERROR_STATE() – Hata durum numarasını verir.
  • ERROR_MESSAGE() – Hatanın tanımını açıklar.
  • ERROR_PROCEDURE() – Hatanın oluştuğu yordam ve tetikleyici ismini verir. ERROR_LINE() – Tetikleyici veya yordam da oluşan hatanın oluştuğu satır numarasını verir.

CATCH bloğunda yeni transactionın durumunu raporlayan XACT_STATE isimli fonksiyon kullanılabilir. Bu fonksiyon 0,1 ve -1 olmak üzere 3 değer döndürür. Şimdi bu durumlara bakalım.

  • 0 – Transaction var olmadığını gösterir.
  • 1 – Transaction var ve commit edilebilir. Bu yüzden COMMIT veya ROLLBACK  çağrılabilir
  • –1 –  Transactiona  başlandığını ve commit edilemeyeceğini gösterir. Eğer  veritabanında  insert, ya da update işlemi yapmak isterseniz hata döner. -1 sonucu alırsak ROLLBACK yapmak gerekir.

Bunları bir örnekle açıklayalım

1)

CREATE  PROCEDURE  hatayakala

AS

BEGIN

       BEGIN TRY

          SELECT  *  FROM EMPLOYEES

       END TRY

       BEGIN CATCH

         SELECT ERRORNUMBER()

       END CATCH

END

GO

 

2)

CREATE  PROCEDURE  hatadeneme

AS

BEGIN

       BEGIN TRY

      SELECT  *  FROM EMPLOYEES

       END TRY

       BEGIN CATCH

         IF (XACT_STATE())=-1

               ROLLBACK TRANSACTION

IF (XACT_STATE())=1

            COMMIT TRANSACTION

       END CATCH

END

 

Transaction başarısız olduğunda,  doomed durum denilen duruma girer. Transaction açık kalır fakat commit edilemez. CATCH bloğunda başarısız olan transactionları rollback yapmak için ROLLBACK TRANSACTION komutunu, ilk komut olarak kullanırız. Eğer hata numarasını istiyorsak @@error’u  CATCH bloğundaki ilk komut olarak okumalıyız. Bu bilgiyi hata log tablosuna aktarmak istiyorsak, @@error’u bir lokal değişkende saklamalı ve ROLLBACK komutundan sonra loglamayı yapmalıyız. ROLLBACK’ten önce yaparsak, hata tablosuna ekleme işlemini yapmamış oluruz.

 

Bir örnek ile açıklayalım:

 

CREATE TABLE dbo.DataTable (ColA int PRIMARY KEY, ColB int)

CREATE TABLE dbo.HataLog (ColA int, ColB int, hata int, 

 date datetime)

GO

 

CREATE PROCEDURE dbo.AddData @a int, @b int AS

SET XACT_ABORT ON

BEGIN TRY

 BEGIN TRAN

    INSERT INTO dbo.DataTable VALUES (@a, @b)

 COMMIT TRAN

END TRY

BEGIN CATCH 

  DECLARE @err int

  SET @err = @@error    

 ROLLBACK TRAN

  INSERT INTO dbo.HataLog VALUES (@a, @b, @err, GETDATE())

END CATCH

GO

 

EXEC dbo.AddData 2, 2

EXEC dbo.AddData 3, 3

EXEC dbo.AddData 3, 4

 

SELECT * FROM dbo.DataTable

SELECT * FROM dbo.HataLog

 

İle sonuçları görülebilir.

 

İyi çalışmalar

 

Bülent Sözge