Avoid Update Commands of All Record

Kadang bila kita sering bekerja dengan perintah-perintah DML, ya namanya manusia kadang ada khilafnya. 
Bagaimana apabila khilaf anda adalah melakukan perintah Update pada sebuah tabel tanpa menggunakan klausa ‘Where’
Tentunya menjadi sebuah kecelakaan yang ‘menggetarkan’ hati bukan ?

Sebenarnya hal ini bisa dicegah sejak dini, yaitu dengan memproteksi salah satu tabel atau semua tabel yang dianggap sangat penting. Pasang trigger pada tabel yang kita inginkan. berikut ini adalah contohnya :

   1: USE AdventureWorks
   2: GO
   3: CREATE TRIGGER production.CegahUpdate 
   4: ON production.product 
   5: FOR UPDATE AS 
   6: BEGIN
   7:      DECLARE @JmlTerupdate int
   8:      SET @JmlTerupdate = @@ROWCOUNT;
   9:      IF @JmlTerupdate >= (SELECT SUM(row_count)jml FROM sys.dm_db_partition_stats 
  10:          WHERE index_id = 1 and OBJECT_ID = OBJECT_ID('production.product'))
  11:      BEGIN
  12:          RAISERROR('Update Semua Data Tidak Diizinkan',16,1) 
  13:          ROLLBACK TRANSACTION
  14:          RETURN;
  15:      END
  16: END
  17: GO

Saya akan coba jelaskan bagaimana trigger production Cegah Update ini bekerja. 
Pada line 7 dan 8, kita coba tangkap jumlah baris yang ter-update pada statement terakhir, yaitu pada DML update yang terjadi. Bila record yang terjadi mencapai angka 2 milyar record atau lebih, jangan gunakan @@Rowcount tapi gunakan ROWCOUNT_BIG dan ubah type data variable @JmlTerupdate dengan BigInt.

Setelah itu pada line 9 dan 10 mencoba untuk membandingkan jumlah baris yang ter-update dan jumlah baris record yang ada pada tabel production.product.  
Jika ternyata jumlah yang ter-update itu lebih atau sama dengan record yang ada, maka proses update yang terjadi akan di rollback (line 13) dan dipasang Raiserror dengan nilai severity 16 (line 12). Severity 16 melambangkan bahwa error yang terjadi dapat diatasi oleh user.

Mari kita coba trigger tersebut. Saya coba untuk update tabel production.product pada field ListPrice. Saya akan ubah semua listprice menjadi 100 .Terlihat proses update telah di aborted. Data tetap pada kondisi sebelum terjadi update.

Demikian semoga bermanfaat.

Tidak ada komentar

trims to http://sqlserver-indo.org. Diberdayakan oleh Blogger.