Kullanıcı Tanımlı Mesajlar Ve Raiserror

Kullanıcı tanımlı hata  mesajı oluşturulmak için kullanılır. Raiserror komutunun görevi ise hatayı fırlatmak. Şimdi bunu daha detaylı bir şekilde hep beraber inceleyelim.

Kullanıcı tanımlı hata  mesajı oluşturulmak için kullanılır. Raiserror komutunun görevi ise hatayı fırlatmak. Şimdi bunu daha detaylı bir şekilde hep beraber inceleyelim.

Kullanıcı Tanımlı Hata Mesajları (sp_addmessage)

Kullanıcı tanımlı hata mesajı oluşturmak için kullanılır.

sp_addmessage [ @msgnum = ] msg_id , [ @severity = ] severity , [ @msgtext = ] 'msg'
msg_id, hata numarasını belirtir.
Kullanıcı tanımlı hataların numaraları 50000’den (ellibin) büyük olmalı.
severity (önem derecesi) , 1 ile 25 arasında bir değer alarak hata mesajının kritik durumunu belirtir. Örneğin 1-10 ile arasındaki değer, bu hata mesajının sadece bir uyarı olduğunu bilgilendirme amaçlı kullanıldığını gösterir. 20-25 arasındaki değerler, yazılım veya donanımdan kaynaklanmış ölümcül bir hata olduğunu belirtir. msgtext parametresi de hata mesajını içerir. Aynı şekilde hatanın Windows Event Log’lara yazılıp yazılamaycağı da boolean türünde değer alan with_log parametresiyle belirtilebilir.

EXEC SP_ADDMESSAGE 50001, 16,'Ürün Fiyatı, 1-2000 arasında olmalıdır.'

Veritabanı sunucusunda tanımlı hata mesajları sys.messages catalog view’inde (master veritabanında view altında) bulunur.
select * from sys.messages
cümleciği ile sistem mesajlari ve kullanıcı tanımlı tüm mesajlar görüntülenir.

Eklenmiş mesajları güncellemek için sp_altermessage yordamı, sistemten kaldırmak için de sp_dropmessage yordamı kullanılır.
EXEC SP_DROPMESSAGE 50002 --ile 50002 nolu mesaj silinir
exec sp_altermessage 50001, 'WITH_LOG', 'true' --50001 hata meydana gelirse loglarda tutulacaktır.

RAISERROR

RAISERROR (, ,
[,
[,<...n>]] )
[WITH option[,...n]]

message ID | message string: istenirse kullanıcı tanımla hata numarası kullanılır istenirse doğrudan hata metni yazılır.

severity: Hatanın önem derecesi
1-10 ile arasındaki değer, bu hata mesajının sadece bir uyarı olduğunu bilgilendirme amaçlı kullanıldığını gösterir.
11-19 arası önem derecesine sahipse Try...catch bloğunun try kısmında çalıştırılır.
20-25 arasındaki değerler, yazılım veya donanımdan kaynaklanmış ölümcül bir hata olduğunu belirtir

state: 1-127 arasında bir değer olmalı. Aynı anda birden çok hata oluştuğunda hataların işlenme sırasını belirtir.

argument: %d, %s için eklenecek parametreler

WITH option: işlem sonucunda oluşan hatanın log dosyasına mı, @@error fonksiyonuna mı atanacağını belirtir, with log ile log dosyasına, with seterror ile @@error fonksiyonuna hata nularası geçilir.

Raiseerror, uygulamalarda kullanılan sistem hataları veya SQL Server veritabanı sistemi tarafından oluşturulan hatalar gibi hata döndürür.

Raiseerror 2 tür hata döndürebilir.

  • sp_addmessage sistem saklı yordamı kullanılarak oluşturulan kullanıcı tanımlı hata mesajı döndürür. Bu mesajların mesaj numarası 50000 (ellibin) den büyüktür.
  • Raiseerror komutunda özel hata mesajı yazılabilir.

Raiseerror ve Print komutları uygulamalara hata mesajı veya bilgi mesajı döndürler. Mesaj, Raiseerror ile döndürüldüğünde metin üzerinde C programlama dilinde printf komutuna yapıldığı gibi (printf komutunda integer değişkenleri yazdırmak için %d, string ifadeleri yazdırmak için %s parametreleri kullanılır) fonksiyonel işlemler yapılabilir. Print komutu ise sadece metin ifadeyi döndürülür. Raiseerror 11-19 arası önem derecesine sahipse Try...catch bloğunun try kısmında çalıştırılır. Hata oluştuğunda catch bloğuna atlamanmasını sağlar. Önem derecesi 10 dan düşük olduğu zaman catch bloğuna atlama işlemi yapılmaz. Print komutu Catch bloğuna atlama işlemi yapamaz.

Raiseerror sys.messages kataloğundaki kullanıcı tanımlı mesajların msg_id si ile kullanıldığında, msg_id Sql Server ir hata numarası olarak döndürülür. Msg_id nin yerine msg_str kullanıldığında, Sql Server hata numarası olarak 50000 döndürür.

Raiseerror de kullanıcı tanımlı hata mesajları kullanıldığında, herbir hata için farklı bir numara verilmelidir. Böyle yapıldığı takdirde hataya sebep olan durumu tespit etmek kolaylaşır.

Raiseerror kullanıldığında

  • T-Sql kodları içerisindeki hataları tespit etmeye yardımcı olur,
  • Verinin değerleri kontrol edilir,
  • Değişken kabul eden mesaj döndürür,
  • Try bloğunda kullanıldığında Catch kısmına atlamayı sağlar
  • Catch bloğunda hata bilgilerini döndürür.

Raiseerror komutunda yazılan özel hata mesajına örnek.

DECLARE @veritabanino INT

SET @veritabanino = DB_ID()-- db_id fonksiyonu veritabanının sistemdeki numarasını verir

 

DECLARE @veritabaniadi NVARCHAR(128)

SET @veritabaniadi = DB_NAME()-- db_name fonksiyonu veritabanın adını verir

 

RAISERROR

    ('Geçerli veritabanının numarası:%d, Veritabanının adı: %s.',

    10, -- Önem Derecesi

    1, -- Durum.

    @veritabanino, -- %d bu değişkenin değerini alacak

    @veritabaniadi) -- %s bu değişkenin değerini alacak

 

çalıştırıldığında aşağıdaki satır elde edilir.
Geçerli veritabanının numarası:6, Veritabanının adı: kayserigundem.

 

aynı örneğin önceden oluşturulmuş kullanıcı tanımlı fonksiyonla kullanımı.

EXECUTE sp_addmessage 50005, -- mesaj numarası

    10, -- Önem derecesi.

   'Geçerli veritabanının numarası:%d, Veritabanının adı: %s.'

GO

DECLARE @veritabanino INT

SET @veritabanino = DB_ID()

 

DECLARE @veritabaniadi NVARCHAR(128)

SET @veritabaniadi = DB_NAME()

 

RAISERROR (50005,

    10, -- Önem derecesi.

    1, -- aynı anda çok hata oluşursa önce buna bak

    @veritabanino, -- %d bu değişkenin değerini alacak

    @veritabaniadi) -- %s bu değişkenin değerini alacak

 

çalıştırıldığında aşağıdaki satır elde edilir.
Geçerli veritabanının numarası:6, Veritabanının adı: kayserigundem.

Telefon +90 505 747 42 84
Email info@devedijital.com
Adres
Tacettin Veli Mahallesi Halit Narin Caddesi Bahadır Plaza Kat:11 Daire:41 38230 Deve Dijital Melikgazi/Kayseri/Türkiye