Menerapkan penanganan kesalahan T-SQL

Selesai

Kesalahan menunjukkan masalah atau masalah penting yang muncul selama operasi database. Kesalahan dapat dihasilkan oleh Mesin Database SQL Server sebagai respons terhadap peristiwa atau kegagalan di tingkat sistem; atau Anda dapat menghasilkan kesalahan aplikasi dalam kode Transact-SQL Anda.

Elemen kesalahan mesin database

Apa pun penyebabnya, setiap kesalahan terdiri dari elemen-elemen berikut:

  • Nomor kesalahan - Nomor unik yang mengidentifikasi kesalahan tertentu.
  • Pesan kesalahan - Teks yang menjelaskan kesalahan.
  • Tingkat keparahan - Indikasi numerik keseriusan dari 1 hingga 25.
  • Status - Kode status internal untuk kondisi mesin database.
  • Prosedur - Nama prosedur tersimpan atau pemicu di mana kesalahan terjadi.
  • Nomor baris - Pernyataan mana dalam batch atau prosedur yang menghasilkan kesalahan.

Kesalahan sistem

Kesalahan sistem telah ditentukan sebelumnya, dan Anda dapat melihatnya dalam tampilan sistem sys.messages . Ketika kesalahan sistem terjadi, SQL Server mungkin mengambil tindakan remedial otomatis, tergantung pada tingkat keparahan kesalahan. Misalnya, ketika kesalahan tingkat keparahan tinggi terjadi, SQL Server mungkin mengambil database offline atau bahkan menghentikan layanan mesin database.

Kesalahan kustom

Anda dapat menghasilkan kesalahan dalam kode Transact-SQL untuk merespons kondisi khusus aplikasi atau untuk menyesuaikan informasi yang dikirim ke aplikasi klien sebagai respons terhadap kesalahan sistem. Kesalahan aplikasi ini dapat didefinisikan secara langsung saat kesalahan tersebut dihasilkan, atau Anda dapat menentukannya di tabel sys.messages bersama dengan kesalahan yang disediakan sistem. Nomor kesalahan yang digunakan untuk kesalahan kustom harus 50001 atau lebih tinggi.

Untuk menambahkan pesan kesalahan kustom ke sys.messages, gunakan sp_addmessage. Pengguna untuk pesan harus menjadi anggota peran server tetap yang tetap, yaitu sysadmin atau serveradmin.

Ini adalah sintaks sp_addmessage:

sp_addmessage [ @msgnum= ] msg_id , [ @severity= ] severity , [ @msgtext= ] 'msg' 
     [ , [ @lang= ] 'language' ] 
     [ , [ @with_log= ] { 'TRUE' | 'FALSE' } ] 
     [ , [ @replace= ] 'replace' ]

Berikut adalah contoh pesan kesalahan kustom menggunakan sintaks ini:

sp_addmessage 50001, 10, N’Unexpected value entered’;

Selain itu, Anda dapat menentukan pesan kesalahan kustom, anggota peran server sysadmin juga dapat menggunakan parameter tambahan, @with_log. Ketika diatur ke TRUE, kesalahan juga akan direkam di log Aplikasi Windows. Pesan apa pun yang ditulis ke log Aplikasi Windows juga ditulis ke log kesalahan SQL Server. Bersikaplah peka dengan penggunaan @with_log opsi karena administrator jaringan dan sistem cenderung tidak suka aplikasi yang "cerewet" dalam log sistem. Namun, jika kesalahan perlu ditangkap oleh peringatan, kesalahan harus terlebih dahulu ditulis ke Log Aplikasi Windows.

Nota

Melaporkan kesalahan sistem tidak didukung.

Pesan dapat diganti tanpa menghapusnya terlebih dahulu dengan menggunakan @replace opsi = 'ganti'.

Pesan dapat disesuaikan dan pesan yang berbeda dapat ditambahkan untuk nomor kesalahan yang sama untuk beberapa bahasa, berdasarkan nilai language_id.

Nota

Pesan dalam bahasa Inggris memiliki language_id 1033.

Memunculkan kesalahan menggunakan RAISERROR

PRINT dan RAISERROR dapat digunakan untuk mengembalikan informasi atau pesan peringatan ke aplikasi. RAISERROR memungkinkan aplikasi untuk memunculkan kesalahan yang kemudian dapat ditangkap oleh proses panggilan.

RAISERROR

Kemampuan untuk memunculkan kesalahan dalam T-SQL membuat penanganan kesalahan dalam aplikasi lebih mudah, karena dikirim seperti kesalahan sistem lainnya. RAISERROR digunakan untuk:

  • Bantu memecahkan masalah kode T-SQL.
  • Periksa nilai data.
  • Mengembalikan pesan yang berisi teks variabel.

Nota

Menggunakan pernyataan PRINT serupa dengan menghasilkan kesalahan dengan tingkat keparahan 10.

Berikut adalah contoh pesan kesalahan kustom menggunakan RAISERROR.

RAISERROR (N'%s %d', -- Message text,
    10, -- Severity,
    1, -- State,
    N'Custom error message number',
    2)

Saat dipicu, ia mengembalikan:

Custom error message number 2

Dalam contoh sebelumnya, %d adalah tempat penampung untuk angka dan %s adalah tempat penampung untuk string. Selain itu, Anda harus mencatat bahwa nomor pesan tidak disebutkan. Ketika kesalahan dengan string pesan dimunculkan menggunakan sintaks ini, mereka selalu memiliki nomor kesalahan 50000.

Memunculkan kesalahan menggunakan THROW

Pernyataan THROW menawarkan metode yang lebih sederhana untuk meningkatkan kesalahan dalam kode. Kesalahan harus memiliki nomor kesalahan minimal 50000.

LEMPAR

THROW berbeda dari RAISERROR dalam beberapa cara:

  • Kesalahan yang dimunculkan oleh THROW selalu memiliki tingkat keparahan 16.
  • Pesan yang dikembalikan oleh THROW tidak terkait dengan entri apa pun dalam sys.sysmessages.
  • Kesalahan yang dimunculkan oleh THROW hanya menyebabkan transaksi dibatalkan saat digunakan bersama dengan SET XACT_ABORT ON dan sesi dihentikan.
THROW 50001, 'An Error Occured',0

Mengambil kode kesalahan menggunakan @@Error

Sebagian besar kode penanganan kesalahan tradisional di aplikasi SQL Server telah dibuat menggunakan @@ERROR. Penanganan pengecualian terstruktur diperkenalkan di SQL Server 2005 dan memberikan alternatif yang kuat untuk menggunakan @@ERROR. Ini akan dibahas dalam pelajaran berikutnya. Sejumlah besar kode penanganan kesalahan SQL Server yang ada didasarkan pada @@ERROR, jadi penting untuk memahami cara bekerja dengannya.

@@ERROR

@@ERROR adalah variabel sistem yang menyimpan jumlah kesalahan kesalahan terakhir yang terjadi. Salah satu tantangan signifikan dengan @@ERROR adalah bahwa nilai yang dimilikinya dengan cepat direset karena setiap pernyataan tambahan dijalankan.

Misalnya, pertimbangkan kode berikut:

RAISERROR(N'Message', 16, 1);
IF @@ERROR <> 0
PRINT 'Error=' + CAST(@@ERROR AS VARCHAR(8));
GO

Anda mungkin mengharapkan bahwa, ketika kode dijalankan, kode akan mengembalikan nomor kesalahan dalam string yang dicetak. Namun, ketika kode dijalankan, kode akan mengembalikan:

Msg 50000, Level 16, State 1, Line 1
Message
Error=0

Kesalahan dimunculkan tetapi pesan yang dicetak adalah "Error=0". Di baris pertama output, Anda dapat melihat bahwa kesalahan, seperti yang diharapkan, sebenarnya 50000, dengan pesan diteruskan ke RAISERROR. Ini karena pernyataan IF yang mengikuti pernyataan RAISERROR berhasil dijalankan dan menyebabkan nilai @@ERROR diatur ulang. Untuk alasan ini, ketika bekerja dengan @@ERROR, penting untuk menangkap nomor kesalahan ke dalam variabel segera setelah dinaikkan, dan kemudian melanjutkan pemrosesan dengan variabel.

Lihat kode berikut yang menunjukkan hal ini:

DECLARE @ErrorValue int;
RAISERROR(N'Message', 16, 1);
SET @ErrorValue = @@ERROR;
IF @ErrorValue <> 0
PRINT 'Error=' + CAST(@ErrorValue AS VARCHAR(8));

Ketika kode ini dijalankan, kode ini mengembalikan output berikut:

Msg 50000, Level 16, State 1, Line 2
Message
Error=50000

Nomor kesalahan dilaporkan dengan benar sekarang.

Memusatkan penanganan kesalahan

Satu masalah signifikan lainnya dengan menggunakan @@ERROR untuk penanganan kesalahan adalah sulit untuk memusatkan dalam kode T-SQL Anda. Penanganan kesalahan cenderung berakhir tersebar di seluruh kode. Dimungkinkan untuk mempusatkan penanganan kesalahan menggunakan @@ERROR sampai batas tertentu, dengan menggunakan label dan pernyataan GOTO. Namun, ini akan dipandang rendah oleh kebanyakan pengembang saat ini sebagai praktik penulisan kode yang buruk.

Membuat pemberitahuan kesalahan

Untuk kategori kesalahan tertentu, administrator mungkin membuat pemberitahuan SQL Server, karena mereka ingin diberi tahu segera setelah ini terjadi. Ini bahkan dapat berlaku untuk pesan kesalahan yang ditentukan pengguna. Misalnya, Anda mungkin ingin menaikkan pemberitahuan setiap kali log transaksi terisi. Pemberitahuan umumnya digunakan untuk membawa kesalahan tingkat keparahan tinggi (seperti tingkat keparahan 19 atau lebih tinggi) untuk menjadi perhatian administrator.

Mengaktifkan peringatan

Pemberitahuan dapat dibuat untuk pesan kesalahan tertentu. Layanan pemberitahuan bekerja dengan mendaftarkan dirinya sebagai layanan panggilan balik dengan layanan pengelogan peristiwa. Ini berarti bahwa pemberitahuan hanya berfungsi pada kesalahan yang dicatat.

Ada dua cara untuk membuat kesalahan memunculkan pemberitahuan—Anda dapat menggunakan opsi WITH LOG saat memunculkan kesalahan atau pesan dapat diubah untuk membuatnya dicatat dengan menjalankan sp_altermessage. Opsi WITH LOG hanya memengaruhi pernyataan saat ini. Menggunakan sp_altermessage mengubah perilaku kesalahan untuk semua penggunaan di masa mendatang. Memodifikasi kesalahan sistem melalui sp_altermessage hanya dimungkinkan dari SQL Server 2005 SP3 atau SQL Server 2008 SP1 dan seterusnya.