Rumah > Artikel > pangkalan data > Apakah tahap pencetus mysql?
Pencetus MySQL adalah peringkat baris. Menurut piawaian SQL, pencetus boleh dibahagikan kepada dua jenis: 1. Pencetus peringkat baris, yang akan diaktifkan sekali untuk setiap baris data yang diubah suai Jika pernyataan memasukkan 100 baris data, pencetus akan dipanggil 100 kali; . Pencetus peringkat penyata Pencetus diaktifkan sekali untuk setiap penyata Penyataan yang memasukkan 100 baris data hanya akan memanggil pencetus sekali. MySQL hanya menyokong pencetus peringkat baris, bukan pencetus peringkat pernyataan yang disediakan.
Persekitaran pengendalian tutorial ini: sistem windows7, versi mysql8, komputer Dell G3.
Pencetus MySQL ialah prosedur tersimpan yang dikaitkan dengan jadual tertentu Apabila data dalam jadual berubah (Tambah, kemas kini, padam) dilaksanakan secara automatik . Operasi yang mengubah suai baris data ini dipanggil peristiwa pencetus. Contohnya, pernyataan seperti INSERT atau LOAD DATA yang memasukkan data boleh mengaktifkan pencetus sisipan.
Mengikut piawaian SQL, pencetus boleh dibahagikan kepada pencetus peringkat baris dan pencetus peringkat pernyataan.
Pencetus peringkat baris akan diaktifkan sekali untuk setiap baris data yang diubah suai Jika pernyataan memasukkan 100 baris data, pencetus akan dipanggil 100 kali; >
Peristiwa yang berbeza boleh mengaktifkan pelbagai jenis pencetus. Pencetus peristiwa INSERT digunakan untuk memasukkan operasi data, termasuk penyata INSERT, LOAD DATA, REPLACE, dll.; PADAM dan GANTIKAN kenyataan, dsb., DROP TABLE dan Penyataan TRUNCATE TABLE tidak mengaktifkan pemadaman pencetus.
Selain itu, pencetus MySQL boleh dilaksanakan sebelum atau selepas peristiwa pencetus, yang masing-masing dipanggil SEBELUM pencetus dan SELEPAS. Kedua-dua pemasaan pencetus ini boleh digabungkan dengan peristiwa pencetus yang berbeza, seperti pencetus SEBELUM INSERT atau SELEPAS KEMASKINI.
Kelebihan pencetus MySQL termasuk:
pencetus tidak boleh menerima parameter dan hanya boleh beroperasi berdasarkan objek pencetus semasa.
1) INSERT pencetus
Pencetus yang bertindak balas sebelum atau selepas pernyataan INSERT dilaksanakan. Anda perlu memberi perhatian kepada perkara berikut apabila menggunakan pencetus INSERT:
Dalam kod pencetus INSERT, anda boleh merujuk jadual maya bernama BARU (tidak sensitif huruf besar-besaran ) untuk mengakses baris yang dimasukkan.Dalam pencetus SEBELUM INSERT, nilai dalam BARU juga boleh dikemas kini, yang membolehkan nilai yang dimasukkan ditukar (selagi ia mempunyai kebenaran operasi yang sepadan). Untuk lajur AUTO_INCREMENT, BARU mengandungi nilai 0 sebelum INSERT dilaksanakan dan akan mengandungi nilai baharu yang dijana secara automatik selepas INSERT dilaksanakan.
Dalam kod pencetus KEMASKINI, jadual maya bernama OLD (tidak sensitif huruf besar-besaran) boleh dirujuk untuk mengakses nilai sebelum pernyataan KEMASKINI dilaksanakan. Dalam pencetus SEBELUM KEMASKINI, nilai dalam BARU juga boleh dikemas kini, yang membolehkan menukar nilai untuk digunakan dalam pernyataan KEMASKINI (selagi anda mempunyai kebenaran operasi yang sepadan) .
LAMA adalah baca sahaja dan tidak boleh dikemas kini.
Nota: Apabila pencetus direka untuk mencetuskan operasi kemas kini jadual itu sendiri, hanya SEBELUM jenis pencetus boleh digunakan dan SELEPAS jenis pencetus tidak akan dibenarkan.
3) PADAM pencetus
Pencetus yang bertindak balas sebelum atau selepas penyataan DELETE dilaksanakan.
Apabila menggunakan pencetus DELETE, anda perlu memberi perhatian kepada perkara berikut:
Dalam kod pencetus DELETE, anda boleh merujuk jadual maya bernama OLD (kes- tidak sensitif) untuk mengakses baris yang dipadam. Semua nilai dalam
LAMA adalah baca sahaja dan tidak boleh dikemas kini.
Secara umumnya, semasa penggunaan pencetus, MySQL akan mengendalikan ralat dengan cara berikut.
Untuk jadual urus niaga, jika pencetus gagal, dan pernyataan yang terhasil gagal, semua perubahan yang dilakukan oleh penyata akan digulung semula untuk jadual bukan transaksi, pengembalian sedemikian tidak boleh dilakukan , walaupun penyata gagal, sebarang perubahan yang dibuat sebelum kegagalan masih berkesan.
Jika pencetus SEBELUM gagal, MySQL tidak akan melaksanakan operasi pada baris yang sepadan.
Jika ralat berlaku semasa pelaksanaan pencetus SEBELUM atau SELEPAS, ia akan menyebabkan keseluruhan pernyataan yang memanggil pencetus gagal.
MySQL akan melaksanakan pencetus SELEPAS hanya jika kedua-dua pencetus SEBELUM dan operasi baris telah berjaya dilaksanakan.
Buat pencetus
MySQL menggunakan pernyataan CREATE TRIGGRT untuk mencipta pencetus Sintaks asas adalah seperti berikut:
CREATE TRIGGER trigger_name { BEFORE | AFTER } { INSERT | UPDATE | DELETE } ON table_name FOR EACH ROW trigger_body;
di mana , nama pencetus ialah nama pencetus SEBELUM dan SELEPAS digunakan untuk menentukan masa pencetus pencetus; pencetus, yang tidak boleh menjadi jadual atau paparan sementara; UNTUK SETIAP BARIS menunjukkan bahawa ini ialah pencetus peringkat baris ialah pernyataan khusus yang dilaksanakan oleh pencetus.
Sebagai contoh, memandangkan gaji pekerja adalah maklumat penting, sejarah pengubahsuaian gaji perlu direkodkan. Mula-mula, kami membuat jadual audit:
CREATE TABLE emp_salary_audit ( audit_id INTEGER NOT NULL AUTO_INCREMENT emp_id INTEGER NOT NULL, old_salary NUMERIC(8,2) NULL, new_salary NUMERIC(8,2) NULL, change_date TIMESTAMP NOT NULL, change_by VARCHAR(50) NOT NULL, CONSTRAINT pk_emp_salary_audit PRIMARY KEY (audit_id) );
Antaranya, audit_id ialah kunci utama auto-increment ialah nombor_gaji_lama dan baru_gaji digunakan untuk menyimpan gaji bulanan sebelum dan selepas pengubahsuaian ; change_date merekodkan masa pengubahsuaian ;change_by merekodkan pengguna yang melakukan operasi pengubahsuaian.
Kemudian buat trigger tri_audit_gaji untuk merekodkan rekod pengubahsuaian gaji bulanan pekerja:
DELIMITER $$ CREATE TRIGGER tri_audit_salary AFTER UPDATE ON employee FOR EACH ROW BEGIN -- 当月薪改变时,记录审计数据 IF (NEW.salary <> OLD.salary) THEN INSERT INTO salary_audit (emp_id, old_salary, new_salary, change_date, change_by) VALUES(OLD.emp_id, OLD.salary, NEW.salary, CURRENT_TIMESTAMP, USER()); END IF; END$$ DELIMITER ;
Antaranya, DELIMITER digunakan untuk mengubah suai aksara akhir penyata SQL prosedur tersimpan lebih awal, Sudah faham; SELEPAS bermaksud untuk melaksanakan pencetus selepas mengubah suai data KEMASKINI bermaksud merekodkan perubahan data hanya untuk operasi kemas kini BARU dan LAMA dalam badan pencetus adalah pembolehubah khas dalam pencetus MySQL, termasuk selepas pengubahsuaian dan sebelum pengubahsuaian; Rekod, tiada pembolehubah LAMA untuk pencetus INSERT, dan tiada pembolehubah BARU untuk pencetus DELETE CURRENT_TIMESTAMP dan USER() ialah fungsi sistem MySQL yang mengembalikan masa semasa dan pengguna log masuk.
Selepas mencipta pencetus, kami melakukan beberapa operasi pengubahsuaian data untuk mengesahkan kesan pencetus:
UPDATE employee SET email = 'sunqian@shuguo.net' WHERE emp_name = '孙乾'; UPDATE employee SET salary = salary * 1.1 WHERE emp_name = '孙乾'; SELECT * FROM salary_audit; audit_id|emp_id|old_salary|new_salary|change_date |change_by| --------|------|----------|----------|-------------------|---------| 1| 25| 4700| 5170|2019-10-18 10:16:36|TONY |
Pernyataan UPDATE pertama hanya mengubah suai alamat e-mel "Sun Qian" , jadi tri_audit_gaji tidak akan dicetuskan; penyata KEMASKINI kedua mengubah suai gaji bulanannya, mencetuskan tri_audit_gaji. Oleh itu, jadual audit gaji_audit mengandungi sekeping data yang merekodkan keadaan sebelum dan selepas pertukaran gaji bulanan.
Jika anda ingin mengaudit operasi menambah dan memadam pekerja pada masa yang sama, anda boleh mencipta pencetus INSERT dan pencetus DELETE.
Selain itu, MySQL menyokong penentuan berbilang pencetus untuk masa pencetus yang sama dan acara yang sama, sambil menyatakan susunan pelaksanaannya:
CREATE TRIGGER trigger_name { BEFORE | AFTER } { INSERT | UPDATE | DELETE } ON table_name FOR EACH ROW { FOLLOWS | PRECEDES } other_trigger trigger_body;
Di mana, FOLLOWS mewakili pencetus Pencetus dilaksanakan selepas pencetus other_trigger; PRECEDES bermakna pencetus dilaksanakan sebelum other_trigger jika tiada pilihan dinyatakan, secara lalai pencetus dilaksanakan mengikut susunan ia dicipta.
Lihat pencetus
Gunakan pernyataan SHOW TRIGGERS untuk melihat senarai pencetus dalam pangkalan data:
SHOW TRIGGERS [{FROM | IN} db_name] [LIKE 'pattern' | WHERE expr]
di mana , db_name digunakan untuk melihat pencetus dalam pangkalan data yang ditentukan, dan lalainya ialah pangkalan data semasa LIKE digunakan untuk memadankan nama prosedur yang disimpan, dan WHERE boleh menentukan lebih banyak syarat penapis. Sebagai contoh, pernyataan berikut mengembalikan pencetus dalam pangkalan data semasa:
mysql> show triggers\G *************************** 1. row *************************** Trigger: tri_audit_salary Event: UPDATE Table: employee Statement: BEGIN -- 当月薪改变时,记录审计数据 IF (NEW.salary <> OLD.salary) THEN INSERT INTO salary_audit (emp_id, old_salary, new_salary, change_date, change_by) VALUES(OLD.emp_id, OLD.salary, NEW.salary, CURRENT_TIMESTAMP, USER()); END IF; END Timing: AFTER Created: 2020-10-06 21:50:02.47 sql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION Definer: root@localhost character_set_client: utf8mb4 collation_connection: utf8mb4_0900_ai_ci Database Collation: utf8mb4_0900_ai_ci 1 row in set (0.00 sec)
Selain itu, jadual sistem MySQL INFORMATION_SCHEMA.TRIGGERS mengandungi maklumat pencetus yang lebih terperinci.
Jika anda ingin mendapatkan pernyataan DDL yang mencipta pencetus, anda boleh TUNJUKKAN kenyataan CREATE TRIGGER. Contohnya:
mysql> SHOW CREATE TRIGGER tri_audit_salary\G *************************** 1. row *************************** Trigger: tri_audit_salary sql_mode: STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION SQL Original Statement: CREATE DEFINER=`root`@`localhost` TRIGGER `tri_audit_salary` AFTER UPDATE ON `employee` FOR EACH ROW BEGIN -- 当月薪改变时,记录审计数据 IF (NEW.salary <> OLD.salary) THEN INSERT INTO salary_audit (emp_id, old_salary, new_salary, change_date, change_by) VALUES(OLD.emp_id, OLD.salary, NEW.salary, CURRENT_TIMESTAMP, USER()); END IF; END character_set_client: utf8mb4 collation_connection: utf8mb4_0900_ai_ci Database Collation: utf8mb4_0900_ai_ci Created: 2020-10-06 21:50:02.47 1 row in set (0.00 sec)
Padam pencetus
MySQL tidak menyediakan pernyataan untuk mengubah suai pencetus Ia hanya boleh dipadamkan dan diulang melalui pernyataan DROP TRIGGER Buat pencetus. Sebagai contoh, pernyataan berikut boleh digunakan untuk memadam trigger tri_audit_gaji:
DROP TRIGGER IF EXISTS tri_audit_salary;
JIKA WUJUD mengelakkan ralat jika trigger tri_audit_gaji tidak wujud.
[Cadangan berkaitan: tutorial video mysql]
Atas ialah kandungan terperinci Apakah tahap pencetus mysql?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!