Cari Cepat Google

Rabu, 30 Maret 2016

Database tentang Trigger

Trigger dalam database berfungsi sebagai pemicu otomatis terhadap suatu event (kejadian).Database yang bisa menggunakan trigger adalah database yang memiliki engine. Seperti contoh sql server (microsoft), mysql (opensource). Baru-baru ini saya mengalamikendala dengan trigger dengan gambaran struktur data yang digunakan adalah sebagai berikut:

Tabel INOVICE
NoInvoice (PK)
KdCust
...
Jumlah
Indeks
Total
Bayar
Sisa (Jumlah*Indeks-bayar) 


Tabel Bayar
NoInvoice (PK)
Tanggal (PK)
Bayar 

secara mekanisme yang digunakan adalah apabila tabel bayar terisi maka secara otomatis akan memicu trigger untuk mengisi tabel invoice pada field bayar.

berikut ini adalah triggernya

CREATE TRIGGER BayarToInvoice ON [dbo].[BAYAR] FOR INSERT, UPDATE, DELETE AS


DECLARE @NOINVOICE AS CHAR(4), 
@NREC Int,    
@BAYAR DECIMAL

SELECT @NOINVOICE = e.NOINVOICE,   @
NREC = Count(*),     
@BAYAR = SUM(e.Bayar)
FROM Bayar  e INNER JOIN inserted i ON e.NOINVOICE = i.NOINVOICE  
GROUP BY e.NOINVOICE

IF (@NREC > 0)
   BEGIN 
       UPDATE INVOICE SET  
            BAYAR = @BAYAR  WHERE   NOINVOICE = @NOINVOICE
   END

Setelah ditest pada saat pengisian tabel bayar maka secara otomatis table bayar pada invoice akan ter-isi dengan benar sesuai dengan entry pada tabel bayar.Namun ada sesuatu yang aneh. Pada saat update pada tabel invoice (bukan dipicu trigger) isi field bayar pada invoice ter-isi dengan jumlah dari bayar untuk nomor invoice yang sama dikali dengan jumlah record pada tabel bayar dengan nomor invoice yang sama.Berarti ada bug pada trigger tersebut. Setelah saya analisa dengan baik maka triggernya saya rubah menjadi

CREATE TRIGGER BayarToInvoice ON [dbo].[BAYAR] FOR INSERT, UPDATE, DELETE AS

 DECLARE @NOINVOICE AS CHAR(4), 
@NREC Int,    
@BAYAR DECIMAL

SELECT @NOINVOICE = e.NOINVOICE
  FROM inserted e

SELECT @NOINVOICE = e.NOINVOICE, 
  @BAYAR = SUM(e.Bayar)
  FROM Bayar  e Where
  e.NOINVOICE = @NOINVOICE 
Group By e.NoInvoice

IF  ISNULL(@BAYAR,0) <> 0
    BEGIN 
    UPDATE INVOICE
          SET    BAYAR = @BAYAR
          WHERE   NOINVOICE = @NOINVOICE
    END


Perhatikan bedanya. Ini mungkin sudah pernah menjadi kendala bagi anda.

Semoga bermanfaat


Sumber : http://elohansenp.blogspot.co.id/2010/11/trigger.html

1 komentar:

Silahkan Tinggalkan Pesan Anda