May 13, 2012

Create Trigger Syntax

CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_body

Pernyataan ini membuat trigger baru. trigger adalah salah satu nama objek database yang berhubungan dengan tabel, dan aktif ketika peristiwa tertentu terjadi pada tabel. Trigger-nya terkait dengan tabel bernama tbl_name, yang harus mengacu pada tabel permanen. Anda tidak dapat mengaitkan trigger dengan tabel TEMPORARY atau tabel view. CREATE TRIGGER ditambahkan di MySQL 5.0.2. Dalam MySQL 5.0 CREATE TRIGGER membutuhkan hak SUPER istimewa . The DEFINER clause menentukan konteks keamanan yang akan digunakan saat memeriksa hak akses pada waktu aktivasi trigger. Ini ditambahkan di MySQL 5.0.17. Lihat nanti dalam bagian ini untuk informasi lebih lanjut. trigger_time adalah waktu pemicu. Hal ini dapat berupa BEFORE atau AFTER untuk menyatakan bahwa trigger aktif sebelum atau setelah setiap baris dimodifikasi. trigger_event menunjukkan jenis pernyataan yang mengaktifkan trigger. trigger_event bisa salah satu dari berikut:
Penting untuk dipahami bahwa trigger_event tidak mewakili tipe literal dari pernyataan SQL yang mengaktifkan begitu banyak trigger seperti jenis operasi tabel. Sebagai contoh, sebuah INSERT trigger diaktifkan tidak hanya dengan INSERT tetapi juga LOAD DATA karena kedua pernyataan memasukkan baris ke dalam tabel. Contoh yang cukup membingungkan dari hal ini adalah INSERT INTO ... ON DUPLICATE KEY UPDATE ... sintaks: BEFORE INSERT trigger akan aktif untuk setiap baris, diikuti dengan AFTER INSERT atau keduanya BEFORE UPDATE dan AFTER UPDATE trigger, tergantung pada apakah ada duplicate key untuk baris. Tidak diperbolehkan ada dua trigger untuk tabel tertentu yang memiliki trigger action time yang sama and trigger event yang sama. Misalnya, Anda tidak dapat memiliki dua BEFORE UPDATE trigger untuk sebuah tabel. Tapi Anda bisa memiliki BEFORE UPDATE dan BEFORE INSERT trigger, atau BEFORE UPDATE dan AFTER UPDATE trigger. trigger_body adalah pernyataan untuk mengeksekusi ketika trigger aktif. Jika Anda ingin mengeksekusi beberapa pernyataan, gunakan BEGIN...END. Hal ini juga memungkinkan Anda untuk menggunakan pernyataan yang sama yang diperbolehkan dalam rutinitas penyimpanan. Lihat Bagian 12.7.1, “BEGIN ... END Compound Statement Syntax”. Beberapa pernyataan yang tidak diijinkan dalam trigger; lihat Bagian E.1, “Restrictions on Stored Routines and Triggers”. Anda bisa merujuk kolom dalam tabel subjek (tabel yang terkait dengan trigger) dengan menggunakan alias OLD dan NEW. OLD.col_name mengacu pada kolom dari sebuah baris yang sudah ada sebelum diperbarui atau dihapus. NEW.col_name mengacu pada kolom dari sebuah baris baru yang akan dimasukkan atau baris yang sudah ada setelah diperbarui. MySQL menyimpan sql_mode pengaturan sistem variabel yang berlaku pada saat trigger dibuat, dan selalu melaksanakan trigger dengan pengaturan yang berlaku, terlepas dari mode SQL Server saat ini. Catatan Saat ini, cascaded foreign key tidak mengaktifkan pemicu. The DEFINER clause menentukan account MySQL yang akan digunakan saat memeriksa hak akses pada saat trigger aktivasi. Jika nilai pengguna diberikan, account MySQL harus ditertentukan sebagai 'user_name'@'host_name' (format yang sama digunakan dalam pernyataan GRANT), CURRENT_USER, atau CURRENT_USER (). Nilai default DEFINER clause adalah pengguna yang mengeksekusi perintah CREATE TRIGGER. Ini sama dengan menetapkan DEFINER = CURRENT_USER secara eksplisit. Jika Anda menggunakan LOCK TABLES untuk mengunci tabel yang memiliki trigger, tabel yang digunakan dalam trigger juga terkunci, seperti yang dijelaskan dalam Bagian 12.3.5.2, “LOCK TABLES and Triggers” Catatan Sebelum MySQL 5.0.10, trigger tidak dapat berisi referensi langsung ke tabel dengan nama. Dimulai dengan MySQL 5.0.10, Anda dapat menulis trigger salah satunya testref seperti ditunjukkan dalam contoh ini:
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);

Misalkan Anda memasukkan nilai berikut ke dalam tabel test1 seperti yang ditunjukkan di sini: 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

Akibatnya, data di empat tabel akan menjadi sebagai berikut:

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) 
 
Ref: 
dev.mysql