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 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 (, ,
[,
[,<...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.
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
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.