membuat trigger di SQL Server 2005

dulu saya sempat beranggapan bahwa trigger itu hanya ada di oracle, ternyata salah besar… 🙂

trigger juga ada di SQL Server

tapi sebelumnya apa itu trigger

saya mencoba menjelaskan dengan bahasa yg paling sedergana ya, kalau diartikan langsung ke bahasa trigger itu artinya adalah pemicu, namun jika dihubungkan ke database, trigger artinya kode SQL yang dikerjakan oleh DBMS ketika suatu kejadian terjadi.n dalam hal ini jika perintah INSERT, UPDATE, atau DELETE dijalankan di DBMS, beribet ya penjelasannya? :p

OK, saya kasih contoh sederhanan saja ya.. misalnya saya punya 2 tabel..tabel barang dan tabel pembelian, untuk lebih jelasnya bisa dilihat pada gambar dibawah ini. dalam tabel barang tersebut ada nama barang dan jumlah stock , IDEnya adalah ketika tabel pembelian ditambahkan, jumlah stock barang akan terupdate secara otomatis.misalnya ketika barang A dibeli sejumlah 3 buah maka nanti stock barang akan bertambah 3 secara otomatis. proses tersebut bisa dilakukan dgn trigger

tabeltrigger

menurut MSDN, syntac dari trigger adalah sebagai berikut

Syntax

CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS
[ { IF UPDATE ( column )
[ { AND | OR } UPDATE ( column ) ]
[ …n ]
| IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
{ comparison_operator } column_bitmask [ …n ]
} ]
sql_statement [ n ]
}
}

biar lebih mengerti, kita mulai dengan contoh.. jadi kita butuh membuat 2 tabel tersebut di SQL server 2005, script sebagai berikut

create table BARANG
(
BAR_ID int not null,
BAR_NAMA varchar(255) not null,
BAR_STOCK int null
default 0,
constraint PK_BARANG primary key (BAR_ID)
)
go

create table PEMBELIAN
(
PEM_ID int not null,
BAR_ID int null ,
PEM_JUMLAH int null ,
constraint PK_PEMBELIAN primary key (PEM_ID)
)
go

create index RELATION_FK on PEMBELIAN (BAR_ID)
go

alter table PEMBELIAN
add constraint FK_PEMBELIA_RELATION_BARANG foreign key (BAR_ID)
references BARANG (BAR_ID)
go

INSERT INTO BARANG (BAR_ID,BAR_NAMA) VALUES (1,’AQUA’);
INSERT INTO BARANG (BAR_ID,BAR_NAMA) VALUES (2,’TOTAL’);
INSERT INTO BARANG (BAR_ID,BAR_NAMA) VALUES (3,’AQUADES’);

setelah anda menjalankan script tersebut, maka anda akan mempunyai 2 tabel, yaitu tabel barang dengan isi 3 buah data, dan tabel pembelian dengan data masih kosong.3 data di tabel barang tersebut secara defaut stocknya adalah 0

kemudian saatnya kita buat trigger sehingga ketika kita menambahkan data di tabel pembelian dengan jumlah pembelian barang tertentu, maka stock di tabel barang akan bertambah sesuai dengan barang yg dibeli, syntac trigger tersebut adalah sebagai berikut

create trigger tambahStockbarang on pembelian
for insert
as
update b set b.bar_stock = b.bar_stock + i.pem_jumlah
from barang b join inserted i on b.bar_id = i.bar_id

arti dari kode tersebut adalah sebagai berikut
create trigger tambahStockbarang on pembelian
membuat trigger dengan nama tambahStockBarang dimana trigger tersebut akan terpicu jika ada perubahan di tabel pembelian

for insert
as

perubahan tersebut adalah penambahan(insert) di tabel pembelian , selain penambahan bisa juga diisi dengan perubahan(update) atau penghapusan(delete)
for disini juga bisa rubah isinya jadi after atau instead of . perbedaanya adalah waktu trigger dikerjakan, biasaya yg sering digunakan adalah for

update b set b.bar_stock = b.bar_stock + i.pem_jumlah
from barang b join inserted i on b.bar_id = i.bar_id

ini adalah kode yg dikerjakan ketika kejadian trigger terpicu, kode diatas bertujuan merubah nilai bar_stock pada tabel barang dengan menambahkan nilai bar_stock yg sekarang dengan jumlah barang yg dibeli (pem_jumlah). perhatikan disini ada tabel yang bernama inserted, tabel tersebut merupakan tabel logika yg digunakan untuk menyimpan data yang memicu terjadinya trigger, dalam hal ini nilai data yg dimasukkan(insert) kedalam tabel pembelian, selain inserted, tabel logika lainnya adalah deleted, tabel logika ini digunakan untuk trigger yg terpicu dengan kejadian delete

kita coba masukkan kode berikut

INSERT INTO PEMBELIAN (PEM_ID, BAR_ID, PEM_JUMLAH) VALUES (1,1,4);
INSERT INTO PEMBELIAN (PEM_ID, BAR_ID, PEM_JUMLAH) VALUES (2,3,2);
INSERT INTO PEMBELIAN (PEM_ID, BAR_ID, PEM_JUMLAH) VALUES (3,1,1);

arti kode tersebut
pem_id haruslah beda karena merupakan primary key
beli aqua(kode bar_id=1) sebanyak 4
beli aquades (kode bar_id=3) sebanyak 2
beli aqua lagi sebanyak 1

sehingga secara keseluruhan yg dibeli aqua sebanyak 5 dan aquades sebanyak 2
karena default nilai stock barang adalah 0, maka seharusnya nilai aqua 5 dan aquades 2 adalah jumlah stock barang sekarang ini

dan kita lihat data barang… walah

hasil trigger

sekian tutorial kali ini tentang membuat trigger di SQL Server, semoga bisa membantu yg lagi kesusahan bikin Tugas Akhir ata pekerjaan

anda bisa belajar tentang bagaimana membuat trigger yang berjalan ketika ada event delete, baca lanjutan artikel ini di membuat trigger di SQL Server 2005 part 2: trigger ketika delete

41 thoughts on “membuat trigger di SQL Server 2005

  1. gor

    ok help full…
    tapi saya lagi kerepotan neh..

    mohon bantuannya dan penjelasannya yah…
    saya saat ini sedang ingin implementasi partisi dengan view…tapi kenapa tidak pernah berhasil?
    dlm tabel
    sudah saya terapkan primary key….
    apa bisa saya manfaatkan trigger?
    tolong diberikan pencerahan yah..

    indra:bisa lebih dijelaskan maksud dari partisi dengan view?
    saya belum bisa menangkap maksud yang anda sampaikan

    Balas
  2. Ping balik: membuat trigger di SQL Server 2005 part 2: trigger ketika delete « indra kharisma

  3. TriFena Rohawati

    Thx banget buat tutorial nya. Kebetulan ak lagi cari informasi tentang trigger. Lumayan membantu deh. soalnya krmn ak baca di buku gak begitu jelas.

    Balas
  4. vidya

    mas..klo bwt polling gt bsa pake trigger jg g?
    kn ktny mas..trigger hnya untuk pnambahan yg lbh dr satu mcam..
    klo polling gt kan cmn nambahin 1 macam, dan nili yng ditambahinnya jg 1.tu gmn mas…?
    saya lg bikin TA ttg pemungutan suara pake ASP.net ma Sal Server 2005..
    malah mentok disitu..maklum..g ngrti..mohon bantuan+solusinya ya mas..!!

    indera: maksudnya cuma hanya 1 perintah yang dijalankan? kalau memang begitu coba bikin store procedures yang nantinya dipanggil oleh trigger
    selamat mencoba

    Balas
  5. yockie

    thanks. bisa dijadikan bahan bacaan.
    saya sedang mengalami kesulitan.
    Knp di sqlserver enterprise saya tidak bisa menjalakan coding :

    USE TESTER;
    GO

    CREATE TRIGGER CONNECT_LIM_TRIGGER6
    ON ALL SERVER WITH EXECUTE AS ‘login_tes’
    FOR LOGON
    AS
    BEGIN
    IF ORIGINAL_LOGIN()= ‘login_tes’ AND
    (SELECT COUNT(*) FROM SYS.DM_EXEC_SESSIONS WHERE IS_USER_PROCESS = 1 AND ORIGINAL_LOGIN_NAME = ‘login_tes’) = 1
    commit;
    END;

    Ada pesan error : “LOGON” is invalid event type. padahal ini seharusnya event yg valid di sql server.

    siapa yg tau solusinya please email ke yocki@hotmail.com

    Balas
  6. tama

    mas…
    kalo punya tabel nasabah yang field2 nya
    – noRek, nama saldo
    trus da table transaksi
    NoTrans,No_rek, SaldoMasuk…
    nah…
    ketika masukin jumlah di saldo masuk,
    trus bagaiman supaya saldo di table nasabah ikut berubah juga, ditambah dengan saldo masuk????
    mohon bantuannya…
    tamaboys@gmail.com

    Balas
  7. arif

    mas sy mau tnya

    kebetulan saya lagi belajar buat sms center, nah autoreplynya saya buat dengan bantuan trigger.
    tapi yang saya masih bingung nanti format sms yg dikirimkan biar smscenternya bs bales gmn ya?(njalanin trigger tsb)

    thanks

    Balas
  8. Asep

    Mas, bagaimana kalau mengunakan looping untuk memasukan data mengunakan trigger, seperti memasukan data pada tabel pembelian yang mempunyai satu nota dan beberapa barang.
    Kalau bisa dengan contoh sql-nya mas

    Balas
  9. Yudha

    mas bisa minta pencerahannya

    Saya lagi belajar buat sms gateway, gimanasih caranya membuat trigger autoreply pada saat sms masuk, kebetulan saya pake databasenya sql server 2005.
    Bisa share contohnya ya mas

    thanks

    Balas
  10. indra

    dear yudha
    berdasarkan deskripsi yang anda berikan, kemungkinan yang anda butuhkan bukan trigger yang telah dijelaskan diatas
    namun lebih kepada event dari SMS gateway, ketika ada SMS masuk, gateway akan menangangkap sebuah event, pada event tersebut anda bisa melakuan perintah untuk mengirim SMS balasannya.

    Balas
  11. tommy

    koq eror ya??

    create trigger kurangiStockbarang on pembelian
    for delete
    as
    update b set b.bar_stock = b.bar_stock – d.pem_jumlah
    from barang b join deleted d on b.bar_id = d.bar_id;

    katanya eror near’on pembelian
    for delete
    as
    update b set b.bar_stock = b.bar_stock – d.pem_jumlah
    f’
    padahal tabel pembelian sudah ad…

    tlg jelaskan ya…
    pgen belajar trigger…
    jadi gw coba-coba deh…

    Balas
    1. achied

      Dear my broo Tommy,
      ———————————————————–
      CREATE TRIGGER TR_Delete_on_Pembelian ON PEMBELIAN
      FOR DELETE
      AS
      BEGIN
      DECLARE @Pem_jumlah INT, @Bar_ID INT

      SELECT @Pem_jumlah = PEM_JUMLAH,@Bar_ID = BAR_ID FROM Deleted

      UPDATE BARANG SET BAR_STOCK = BAR_STOCK – @Pem_Jumlah
      WHERE BAR_ID = @Bar_ID

      END
      GO
      ———————————————————

      Balas
  12. simba

    waah triger bikin puyeng, tapi bentar lagi harus ngajar basis data, tak ada jalan lain lagi kecuali belajar, oh ya mas q nginstall possgrees tapi kuk gak ada help nya ya???

    Balas
  13. Peter

    Mas…Kalo misalnya dalam kasus yang mas berikan di atas kan kalau barang nya sudah ada di master Barang…tp kalo barang nya belum ada di master barang trigger nya bagaimana tuh mas?mohon pencerahannya

    Balas
    1. achied

      For Peter;

      Pertama kali anda mencoba untuk memasukkan BAR_ID pada tabel Pembelian yang ternyata BAR_ID tersebut tidak di dalam tabel Barang maka pasti akan terjadi error “The INSERT statement conflicted with the FOREIGN KEY constraint “FK_PEMBELIA_RELATION_BARANG”.” Ini yang namanya refential integrity. Pemasukan data yg tidak valid dapat dilakukan dengan menggunakan blok TRY..CATCH untuk menagkap kesalahan.
      Tetapi jika anda ingin melihat keberadaan BAR_ID tertentu bisa anda buat seperti :
      ——————————————————
      create trigger tambahStockbarang on pembelian
      for insert
      as
      BEGIN

      DECLARE @Pem_jumlah INT, @Bar_ID INT

      SELECT @Pem_jumlah = PEM_JUMLAH,@Bar_ID = BAR_ID FROM Inserted

      IF EXISTS (SELECT 1 FROM BARANG WHERE BAR_ID = @Bar_ID)
      BEGIN
      update BARANG set BAR_STOCK = BAR_STOCK + @Pem_Jumlah
      WHERE BAR_ID = @Bar_ID
      END
      ELSE
      PRINT ‘Barang tidak ada, mohon masukkan data barang tersebut terlebih dahulu !’
      END
      GO
      ——————————————————
      Yang saya nyakin trigger ini tidak akan terjadi karena SQL server sudah menangkap error dan menghentikan eksekusi. 🙂

      Balas
  14. SQL Server Freak

    Bos,

    Implementasi trigger di bawah (sangat) mudah dilakukan di Oracle:

    CREATE OR REPLACE TRIGGER my_schema.trg_insert_1
    before INSERT
    ON my_schema.my_table
    FOR EACH ROW
    declare
    v_nurut number;
    BEGIN
    if inserting then
    begin
    select nvl(max(ID),0) +1 into v_nurut
    from my_table;
    exception
    when no_data_found then v_nurut:=1;
    end;
    :new.ID:=v_nurut;
    end if;
    end trg_insert_1;

    Saya pengen mengimplementasi trigger ini di SQL Server 2005, saya sudah mutar-mutar kesana-kemari, tapi solusinya ngga ketemu.

    Gimana caranya?

    regards,

    Balas
  15. dody

    selamat sore ,mohon bantuannya saya sedang mencoba sql inventory ,bagaimana caranya saya ingin membuat sebuah output laporan yang berisi informasi barang selama 3 bulan dari pembelian tidak laku atau belum ada penjualan,terima kasih

    Balas
  16. dody

    oh ya maaf ada yang kurang Table yg sudah dibuat
    Tabel DtBarang
    Tabel Penjualan
    Tabel ItemPenjualan
    Tabel PEmbelian
    Tabel ItemPembelian,

    Balas
  17. Mei. (@meililiaa)

    saya mau ngimplementasikan trigger, antara tabel peminjaman dan tabel pengembalian.
    jadi di tabel peminjaman itu ada atribut id_pinjam, NIM, Kode_Buku,tgl_pinjam dan tgl_kembali, nah di tabel pengembalian itu ada id_kembali, id_pinjam, NIM, Kode_Buku,tgl_pinjam,tgl_kembali, nnterlambat dan denda.
    konsepnya jadi gini, di tabel pengembalian kan ada semua atribut dari tabel peminjaman, jadi saat id_pinjam di submit di tabel pengembalian semua isi dr tabel peminjaman muncul, nah saat di save isi dari tabel peminjaman itu terhapus semua.. bagaimana query trigger yg harus di gunakan??? tolong dibalas trims sblmnya 🙂

    Balas
  18. Www.denverlinux.Com

    Skype has launched its online-structured customer beta on the
    world, after establishing it extensively in the U.S.

    and You.K. before this calendar month. Skype for Web also now
    works with Linux and Chromebook for immediate text messaging
    conversation (no video and voice but, individuals need a connect-in installment).

    The increase from the beta provides assist for a longer set of spoken languages to aid bolster that international usability

    Balas

Tinggalkan komentar