Prevent Insert Using Trigger

ada suatu kondisi dimana saya harus membuat sebuah tabel dalam database postgreSQL akan dikenakan proses insert yg banyak dari banyak mesin yang mengirimkan data yang kodisi nya bisa saja terjadi data yang sama, sedangkan di tabel target ada syarat dimana data tidak boleh redundan ketika di timpa banyak kondisi insert yang tidak terkontrol, lagi bagaiamana mensiasatinya ?

untuk mencapai goal tersebut, saya akan simulasikan langkah2 penyelesaiannya dengan cara berikut :
misal table target itu adalah tabel yang saya beri nama testtrigger.
create table public.testtrigger(id serial, kode varchar(3), kode2 integer, nama varchar(100),
CONSTRAINT testtrigger_pkey PRIMARY KEY (id), CONSTRAINT nomords_pkeyunique UNIQUE (kode,kode2));

jadi yang menjadi unique key nya adalah field kode dan field kode2.

setelah itu saya buat function untuk kebutuhan trigger sebagai berikut :

CREATE or replace FUNCTION check_if_data_exist()
RETURNS trigger AS
$func$
BEGIN
IF EXISTS (SELECT kode FROM testtrigger c WHERE c.kode = NEW.kode and c.kode2= NEW.kode2)
THEN RETURN NULL;
END IF;
RETURN NEW;
END
$func$ LANGUAGE plpgsql;

lihat di function diatas, saya buatkan kondisi bhw jika data yg mau di insert sudah ada di table, maka yang terjadi adalah return NULL, dengan begitu tidak ada data yang terinsert.

kemudian saya buat juga trigger nya sebagai berikut :

CREATE TRIGGER tr_check_if_data_exist
BEFORE INSERT ON testtrigger
FOR EACH ROW EXECUTE PROCEDURE check_if_data_exist();

kemudian saya coba jalankan query sebagai berikut :

insert into testtrigger(kode,kode2, nama) values('001',3, 'tes 1');

saat query ini dijalankan, data berhasil masuk 1 buah record, namun setelah saya eksekusi ulang perintah insert diatas, data tidak bertambah. berarti dalam hal ini teknik ini sudah berhasil.

demikian semoga bermanfaat.

Leave a Reply