SQL Server Indonesia User Groups Community Avoid Update Commands of All Record - suherman
Welcome to SQL Server User Group Indonesia
Sign in JoinHelp | Sign In Live ID

suherman

Share ur Knowledge

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.CegahUpdate ini bekerja. 

Pada line 7 dan 8, kita coba tangkap jumlah baris yang terupdate 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 rubah type data variable @JmlTerupdate dengan BigInt.

Setelah itu pada line 9 dan 10 mencoba untuk membandingkan jumlah baris yang terupdate dan jumlah baris record yang ada pada tabel production.product. Jika ternyata jumlah yang terupdate 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 dan berikut hasilnya

updateall

terlihat proses update telah di aborted. data tetap pada kondisi sebelum terjadi update.

Demikian semoga bermanfaat.

Posted: Jan 13 2010, 02:10 PM by Suherman | with no comments
Filed under: