Sabtu, 19 September 2009

TRIGGER

Trigger merupakan nama dari object database yang dikaitkan dengan sebuah tabel dan diaktifkan ketika terjadi sebuah even terhadap tabel. Database event tersebut adalah proses insert, update, dan delete.Trigger akan secara otomatis dijalankan ketika suatu event/aksi berlangsungpada database.Trigger tidak dapat langsung dieksekusi seperti Store procedure, tidak memiliki parameter dan return code.
Syntax Umum Triger
CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
Keterangan
1.DEFINER menunjukkan nama user yang mempunyai hak akses untuk mengakses triger.
2.Triger_time menunjukkan saat triger tersebut dijalankan. Terdiri dari Before atau After
3.Triger_time menandakan saat keadaan bagaimana triger tersebut aktif. Terdiri dari
a.Insert : Triger aktif saat baris baru dimasukkan ke dalam tabel
b.Update : Triger aktif saat ada baris diperbaharui dimasukkan di dalam tabel
c.Delete :Triger aktif saat baris dihapus dalam tabel
Contoh Trigers
CREATE TABLE test1(a1 INT);
CREATE TABLE test2(a2 INT);
CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
CREATE TABLE test4
(
a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
b4 INT DEFAULT 0
);

DELIMITER |
CREATE TRIGGER testref BEFORE INSERT ON test1
FOR EACH ROW BEGIN
INSERT INTO test2 SET a2 = NEW.a1;
DELETE FROM test3 WHERE a3 = NEW.a1;
UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
END;
|
DELIMITER ;
INSERT INTO test3 (a3) VALUES
(NULL), (NULL), (NULL), (NULL), (NULL),
(NULL), (NULL), (NULL), (NULL), (NULL);
INSERT INTO test4 (a4) VALUES
(0), (0), (0), (0), (0), (0), (0), (0), (0), (0);
Silakan masukkan nilai ke test1
mysql> INSERT INTO test1 VALUES
-> (1), (3), (1), (7), (1), (8), (4), (4);
Query OK, 8 rows affected (0.01 sec)
Records: 8 Duplicates: 0 Warnings: 0
Hasilnya
mysql> SELECT * FROM test1;
+------+
| a1 |
+------+
| 1 |
| 3 |
| 1 |
| 7 |
| 1 |
| 8 |
| 4 |
| 4 |
+------+
8 rows in set (0.00 sec)
mysql> SELECT * FROM test2;
+------+
| a2 |
+------+
| 1 |
| 3 |
| 1 |
| 7 |
| 1 |
| 8 |
| 4 |
| 4 |
+------+
8 rows in set (0.00 sec)
mysql> SELECT * FROM test3;
+----+
| a3 |
+----+
| 2 |
| 5 |
| 6 |
| 9 |
| 10 |
+----+
5 rows in set (0.00 sec)
mysql> SELECT * FROM test4;
+----+------+
| a4 | b4 |
+----+------+
| 1 | 3 |
| 2 | 0 |
| 3 | 1 |
| 4 | 2 |
| 5 | 0 |
| 6 | 0 |
| 7 | 1 |
| 8 | 1 |
| 9 | 0 |
| 10 | 0 |
+----+------+
10 rows in set (0.00 sec)
Jadi suatu event bisa diotomatisasi jika ada event lain yang telah terjadi. Sederhananya begitu. Di sini aku mengimplementasikan dengan mencoba pada dua hal.
1.Menginsert ke tabel lain pada data base
Pada kasus ini untuk membuat sms balasan, caranya cukup mengatur agar setiap ada isian baru di tabel inbox, mysql otomatis meng-insert isian baru ke tabel outbox.
Karena pada aplikasi sms gateway ini sudah ada daemon khusus, maka otomatis isian tabel outbox akan dikirim sebagai pesan sms.
Ini sintaksnya : (cukup sebagai refernsi saja, tergantung struktur database dan tabelnya)
DELIMITER//
CREATE TRIGGER test AFTER INSERT ON inbox
FOR EACH ROW BEGIN
INSERT INTO outbox VALUES (sysdate(),sysdate(),(SELECT SenderNumber FROM inbox),'Default_No_Compression','Terima kasih. Laporan Anda akan segera ditindak lanjuti.',sysdate(),'yes');
END;
//DELIMITER

DELIMITER//
CREATE TRIGGER test AFTER INSERT ON inbox
FOR EACH ROW BEGIN
INSERT INTO outbox VALUES (sysdate(),sysdate(),(SELECT SenderNumber FROM inbox),'Default_No_Compression','Terima kasih. Laporan Anda akan segera ditindak lanjuti.',sysdate(),'yes');
END;
//DELIMITER

DELIMITER//
CREATE TRIGGER test AFTER INSERT ON inbox
FOR EACH ROW BEGIN
INSERT INTO outbox VALUES (sysdate(),sysdate(),(SELECT SenderNumber FROM inbox),'Default_No_Compression','Terima kasih. Laporan Anda akan segera ditindak lanjuti.',sysdate(),'yes');
END;
//DELIMITER
Untuk lebih jelas tentang trigger di atas, mungkin perlu diketahui struktur tabel outbox adalah seperti ini (nama field dan tipe datanya) :
· `UpdatedInDB` timestamp
· `InsertIntoDB` timestamp
· `SendingDateTime` timestamp
· `Text` text
· `DestinationNumber` varchar(20)
· `Coding` enum(’Default_No_Compression’, ‘Unicode_No_Compression’,
‘8bit’, ‘Default_Compression’, ‘Unicode_Compression’)
· `UDH` text
· `Class` int(11)
· `TextDecoded` varchar(160)
· `ID` int(11) unsigned
· `MultiPart` enum(’false’,'true’)
· `RelativeValidity` int(11)
· `SenderID` text
· `SendingTimeOut` timestamp
· `DeliveryReport` enum(’default’,'yes’,'no’)
· `CreatorID` text
Sedangkan struktur tabel inbox seperti ini (nama field dan tipe datanya):
· `UpdatedInDB` timestamp
· `ReceivingDateTime` timestamp
· `Text` text
· `SenderNumber` varchar(20)
· `Coding` enum(’Default_No_Compression’, ‘Unicode_No_Compression’,
‘8bit’, ‘Default_Compression’, ‘Unicode_Compression’)
· `UDH` text
· `SMSCNumber` varchar(20)
· `Class` int(11)
· `TextDecoded` varchar(160)
· `ID` int(11) unsigned
· `RecipientID` text
· `Processed` enum(’false’, ‘true’)

2.Menginsert ke tabel lain yang berbeda database.
Pada kasus ini untuk membuat copy isian satu database ke database master. Caranya cukup mengatur agar setiap ada isian baru di tabel inbox (database slave), mysql otomatis meng-insert isian baru yang sama ke tabel inbox di database master. Nama database slave adalah ’smsd1′, sedangkan database masternya’smsd0′.Berikut ini sintaksnya :

DELIMITER //
CREATE TRIGGER slave2master AFTER INSERT ON smsd1.inbox
FOR EACH ROW BEGIN INSERT INTO smsd0.inbox VALUES ((SELECT UpdatedInDB FROM smsd1.inbox),(SELECT ReceivingDateTime FROM smsd1.inbox),(SELECT Text FROM smsd1.inbox),(SELECT SenderNumber FROM smsd1.inbox),(SELECT Coding FROM smsd1.inbox),(SELECT UDH FROM smsd1.inbox),(SELECT SMSCNumber FROM smsd1.inbox),(SELECT Class FROM smsd1.inbox),(SELECT TextDecoded FROM smsd1.inbox),(SELECT ID FROM smsd1.inbox),(SELECT RecipientID FROM smsd1.inbox),(SELECT Processed FROM smsd1.inbox),1);
END;
//DELIMITER;


DELIMITER //
CREATE TRIGGER slave2master AFTER INSERT ON smsd1.inbox
FOR EACH ROW BEGIN
INSERT INTO smsd0.inbox VALUES ((SELECT UpdatedInDB FROM smsd1.inbox),(SELECT ReceivingDateTime FROM smsd1.inbox),(SELECT Text FROM smsd1.inbox),(SELECT SenderNumber FROM smsd1.inbox),(SELECT Coding FROM smsd1.inbox),(SELECT UDH FROM smsd1.inbox),(SELECT SMSCNumber FROM smsd1.inbox),(SELECT Class FROM smsd1.inbox),(SELECT TextDecoded FROM smsd1.inbox),(SELECT ID FROM smsd1.inbox),(SELECT RecipientID FROM smsd1.inbox),(SELECT Processed FROM smsd1.inbox),1);
END;
//DELIMITER;
.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.

0 komentar:

Posting Komentar

Voltar Avançar Inicio
 

Topo