Rumah >pangkalan data >tutorial mysql >Apakah tahap pencetus mysql?

Apakah tahap pencetus mysql?

青灯夜游
青灯夜游asal
2023-03-30 20:05:161534semak imbas

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.

Apakah tahap pencetus mysql?

Persekitaran pengendalian tutorial ini: sistem windows7, versi mysql8, komputer Dell G3.

Gambaran keseluruhan pencetus

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; >

  • Pencetus peringkat penyata diaktifkan sekali untuk setiap penyata Pernyataan yang memasukkan 100 baris data hanya akan memanggil pencetus sekali.
  • MySQL hanya menyokong pencetus peringkat baris, bukan pencetus peringkat pernyataan yang disediakan.

Apakah tahap pencetus mysql?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:

    Rekod dan semak operasi pengubahsuaian pengguna pada data dalam jadual untuk melaksanakan fungsi pengauditan;
  • Melaksanakan kekangan integriti yang lebih kompleks daripada kekangan semak, seperti melarang operasi data semasa bukan waktu perniagaan; Kemas kini secara automatik bilangan orang dalam jabatan apabila memadamkan pekerja;
  • Walaupun pencetus berkuasa, ia juga mempunyai beberapa kelemahan:
  • Pencetus akan meningkatkan Kerumitan struktur pangkalan data, dan pencetus tidak kelihatan kepada aplikasi dan sukar untuk nyahpepijat;

Pencetus perlu menduduki lebih banyak sumber pelayan pangkalan data Cuba gunakan kekangan bukan nol, unik dan semak yang disediakan oleh pangkalan data. dll.;

pencetus tidak boleh menerima parameter dan hanya boleh beroperasi berdasarkan objek pencetus semasa.
  • Menggunakan pencetus untuk senario khas boleh membawa kemudahan tertentu; tetapi jangan terlalu bergantung pada pencetus untuk mengelakkan kemerosotan prestasi pangkalan data dan kesukaran penyelenggaraan. Seterusnya kami memperkenalkan operasi pengurusan pencetus.
  • Tiga pencetus disokong oleh MySQL
  • Dalam penggunaan sebenar, MySQL menyokong tiga pencetus: INSERT trigger, UPDATE trigger dan DELETE trigger.

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.
  • 2) KEMASKINI pencetus
  • Pencetus yang bertindak balas sebelum atau selepas pernyataan KEMASKINI dilaksanakan.
  • Apabila menggunakan pencetus KEMASKINI, anda perlu memberi perhatian kepada perkara berikut:

Dalam kod pencetus KEMASKINI, anda boleh merujuk jadual maya bernama BARU (kes- tidak sensitif) untuk mengakses nilai yang dikemas kini.

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) .
    Semua nilai dalam
  • 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 = &#39;sunqian@shuguo.net&#39;
WHERE emp_name = &#39;孙乾&#39;;

UPDATE employee
SET salary = salary * 1.1
WHERE emp_name = &#39;孙乾&#39;;

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 &#39;pattern&#39; | 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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn