觸發器學習筆記

2022-08-03 00:09:13 字數 3055 閱讀 3172

觸發器學習

概念:觸發器是一種特殊的儲存過程,mysql5.0以上版本支援觸發器,觸發器是與表有關的命名資料庫物件,當表出現特定事件時,將啟用該物件。

觸發器可以處理很多需要程式來完成的工作,這樣做的好處是減輕程式帶來的各種各樣的問題如,效率、bug和維護等。

當對某一表進行諸如update、 insert、 delete 這些操作時,就會自動執行觸發器所定義的sql 語句。

許可權說明:

啟用觸發程式時,對於觸發程式引用的所有old和new列,需要具有select許可權,對於作為set賦值目標的所有new列,需要具有update許可權。

create trigger語句需要super許可權。

注意事項:

1、tbl_name必須引用永久性表。不能將觸發程式與temporary表或檢視關聯起來。

2、對於具有相同觸發程式動作時間和事件的給定表,不能有兩個觸發程式。例如,對於某一表,不能有兩個before update觸發程式。但可以有1個before update觸發程式和1個before insert觸發程式,或1個before update觸發程式和1個after update觸發程式。

3、在insert觸發程式中,僅能使用new.col_name,沒有舊行。在delete觸發程式中,僅能使用old.col_name,沒有新行。在update觸發程式中,可以使用old.col_name來引用更新前的某一行的列,也能使用new.col_name來引用更新後的行中的列。

4、trigger_event能被load date語句啟用;

5、觸發程式不能使用以顯式或隱式方式開始或結束事務的語句,如start transaction、commit或rollback;

6、用old命名的列是唯讀的。你可以引用它,但不能更改它。對於用new命名的列,如果具有select許可權,可引用它。在before觸發程式中,如果你具有update許可權,可使用「set new.col_name = value」更改它的值;

7、在before觸發程式中,auto_increment列的new值為0,不是實際插入新記錄時將自動生成的序列號。

8、觸發程式不能呼叫將資料返回客戶端的儲存程式,也不能使用採用call語句的動態sql;

建立觸發器

建立觸發器的語法:

create trigger trigger_name trigger_time trigger_event on tbl_name for each row trigger_stmt

trigger_name 觸發器的名稱。

trigger_time是觸發程式的動作時間。它可以是before或after,以指明觸發程式是在啟用它的語句之前或之後觸發。

trigger_event指明了啟用觸發程式的語句的型別。trigger_event可以是下述值之一:

·         insert:將新行插入表時啟用觸發程式,例如,通過insert、load data和replace語句。

·         update:更改某一行時啟用觸發程式,例如,通過update語句。

·         delete:從表中刪除某一行時啟用觸發程式,例如,通過delete和replace語句。

trigger_stmt是當觸發程式啟用時執行的語句。如果你打算執行多個語句,可使用begin ... end復合語句結構。

簡單的例子:

統計表content中記錄的條數,插入的時候需要通過促發起增加count_content欄位的值,刪除的時候需要減小count_content欄位的值

delimiter $$

create trigger `tr_count_insert` after insert on `content`

for each row begin

update t_count set count_content = count_content + 1;

end$$

delimiter ;

delimiter $$

create trigger `tr_count_delete` after delete on `content`

for each row begin

update t_count set count_content = count_content - 1;

end$$

delimiter ;

將mount的值限定在0-100之間,如果小於0的話會更改成0,如果大於100的話會更改成100

create table test (account int(10),mount decimal(10,2))engine=innodb;

delimiter //

create trigger test_check before insert on test

for each row

begin

if new.mount < 0 then

set new.mount=0;

elseif new.mount > 100 then

set new.mount = 100;

end if;

end;//

delimiter ;

insert into test values(10,-100),(12,120);

select * from test;

+---------+--------+

| account | mount  |

+---------+--------+

|      10 |   0.00 |

|      12 | 100.00 |

+---------+--------+

查詢觸發器

命令:show triggers;

刪除觸發器

語法:drop trigger [schema_name.]trigger_name

該語句使用者刪除觸發器,[schema_name.]用於指定所在的資料庫的名稱,若未加,則預設為當前選中的資料庫。

使用舉例:刪除前面建的觸發器:

drop trigger test_check;

觸發器六 系統觸發器 學習筆記

系統觸發器用於監視資料庫服務的開啟 關閉 錯誤等資訊的取得,或者是監控使用者的行為操作等。如果要建立系統觸發器,可以使用如下的語法 create or replace trigger 觸發器名稱 before after 資料庫事件 on database schema when 觸發條件 decl...

觸發器六 系統觸發器 學習筆記

系統觸發器用於監視資料庫服務的開啟 關閉 錯誤等資訊的取得,或者是監控使用者的行為操作等。如果要建立系統觸發器,可以使用如下的語法 create or replace trigger 觸發器名稱 before after 資料庫事件 on database schema when 觸發條件 decl...

觸發器一(觸發器簡介) 學習筆記

語法 create or replace trigger trigger name 建立乙個觸發器,設定名稱,如果選擇了or replace,則表示如果已經有這個觸發器就替換 befor after 指的是觸發器的觸發日間,在操作之間就beforc,在操作之後就after觸發 instead of ...