青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

xiaoguozi's Blog
Pay it forword - 我并不覺的自豪,我所嘗試的事情都失敗了······習(xí)慣原本生活的人不容易改變,就算現(xiàn)狀很糟,他們也很難改變,在過程中,他們還是放棄了······他們一放棄,大家就都是輸家······讓愛傳出去,很困難,也無法預(yù)料,人們需要更細(xì)心的觀察別人,要隨時注意才能保護(hù)別人,因?yàn)樗麄兾幢刂雷约阂裁础ぁぁぁぁ?/span>
1   引言

Mysql的觸發(fā)器和存儲過程一樣,都是嵌入到mysql的一段程序。觸發(fā)器是mysql5新增的功能,目前線上鳳巢系統(tǒng)、北斗系統(tǒng)以及哥倫布系統(tǒng)使用的數(shù)據(jù)庫均是mysql5.0.45版本,很多程序比如fc-star管理端,sfrd(das),dorado都會用到觸發(fā)器程序,實(shí)現(xiàn)對于數(shù)據(jù)庫增、刪、改引起事件的關(guān)聯(lián)操作。本文介紹了觸發(fā)器的類型和基本使用方法,講述了觸發(fā)器使用中容易產(chǎn)生的誤區(qū),從mysql源碼中得到觸發(fā)器執(zhí)行順序的結(jié)論,本文最后是實(shí)戰(zhàn)遭遇的觸發(fā)器經(jīng)典案例。沒有特殊說明時,本文的實(shí)驗(yàn)均基于mysql5.0.45版本。

2   Mysql觸發(fā)器的類型

2.1   Mysql觸發(fā)器的基本使用

創(chuàng)建觸發(fā)器。創(chuàng)建觸發(fā)器語法如下:

CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt

其中trigger_name標(biāo)識觸發(fā)器名稱,用戶自行指定;

trigger_time標(biāo)識觸發(fā)時機(jī),用before和after替換;

trigger_event標(biāo)識觸發(fā)事件,用insert,update和delete替換;

tbl_name標(biāo)識建立觸發(fā)器的表名,即在哪張表上建立觸發(fā)器;

trigger_stmt是觸發(fā)器程序體;觸發(fā)器程序可以使用begin和end作為開始和結(jié)束,中間包含多條語句;

下面給出sfrd一個觸發(fā)器實(shí)例:

CREATE /*!50017 DEFINER = 'root'@'localhost' */ TRIGGER trig_useracct_update
AFTER UPDATE
ON SF_User.useracct FOR EACH ROW
BEGIN
IF OLD.ulevelid = 10101 OR OLD.ulevelid = 10104 THEN
IF NEW.ulevelid = 10101 OR NEW.ulevelid = 10104 THEN
if NEW.ustatid != OLD.ustatid OR NEW.exbudget != OLD.exbudget THEN
INSERT into FC_Output.fcevent set type = 2, tabid = 1, level = 1, userid = NEW.userid, ustatid = NEW.ustatid, exbudget = NEW.exbudget;
end if;
ELSE
INSERT into FC_Output.fcevent set type = 1, tabid = 1, level = 1, userid = NEW.userid, ustatid = NEW.ustatid, exbudget = NEW.exbudget;
END IF;
END IF;
END;


上述觸發(fā)器實(shí)例使用了OLD關(guān)鍵字和NEW關(guān)鍵字。OLD和NEW可以引用觸發(fā)器所在表的某一列,在上述實(shí)例中,OLD.ulevelid表示表 SF_User.useracct修改之前ulevelid列的值,NEW.ulevelid表示表SF_User.useracct修改之后 ulevelid列的值。另外,如果是insert型觸發(fā)器,NEW.ulevelid也表示表SF_User.useracct新增行的 ulevelid列值;如果是delete型觸發(fā)器OLD.ulevelid也表示表SF_User.useracct刪除行的ulevelid列原值。

另外,OLD列是只讀的,NEW列則可以在觸發(fā)器程序中再次賦值。

上述實(shí)例也使用了IF,THEN ,ELSE,END IF等關(guān)鍵字。在觸發(fā)器程序體中,在beigin和end之間,可以使用順序,判斷,循環(huán)等語句,實(shí)現(xiàn)一般程序需要的邏輯功能。

查看觸發(fā)器。查看觸發(fā)器語法如下,如果知道觸發(fā)器所在數(shù)據(jù)庫,以及觸發(fā)器名稱等具體信息:

SHOW TRIGGERS from SF_User like "usermaps%";
       //查看SF_User庫上名稱和usermaps%匹配的觸發(fā)器

如果不了解觸發(fā)器的具體的信息,或者需要查看數(shù)據(jù)庫上所有觸發(fā)器,如下:

SHOW TRIGGERS;       //查看所有觸發(fā)器

用上述方式查看觸發(fā)器可以看到數(shù)據(jù)庫的所有觸發(fā)器,不過如果一個庫上的觸發(fā)器太多,由于會刷屏,可能沒有辦法查看所有觸發(fā)器程序。這時,可以采用如下方式:

Mysql中有一個information_schema.TRIGGERS表,存儲所有庫中的所有觸發(fā)器,desc information_schema. TRIGGERS,可以看到表結(jié)構(gòu):

+----------------------------+--------------+------+-----+---------+-------+
| Field                      | Type         | Null | Key | Default | Extra |
+----------------------------+--------------+------+-----+---------+-------+
| TRIGGER_CATALOG            | varchar(512) | YES |     | NULL    |       |
| TRIGGER_SCHEMA             | varchar(64) | NO   |     |         |       |
| TRIGGER_NAME               | varchar(64) | NO   |     |         |       |
| EVENT_MANIPULATION         | varchar(6)   | NO   |     |         |       |
| EVENT_OBJECT_CATALOG       | varchar(512) | YES |     | NULL    |       |
| EVENT_OBJECT_SCHEMA        | varchar(64) | NO   |     |         |       |
| EVENT_OBJECT_TABLE         | varchar(64) | NO   |     |         |       |
| ACTION_ORDER               | bigint(4)    | NO   |     | 0       |       |
| ACTION_CONDITION           | longtext     | YES |     | NULL    |       |
| ACTION_STATEMENT           | longtext     | NO   |     |         |       |
| ACTION_ORIENTATION         | varchar(9)   | NO   |     |         |       |
| ACTION_TIMING              | varchar(6)   | NO   |     |         |       |
| ACTION_REFERENCE_OLD_TABLE | varchar(64) | YES |     | NULL    |       |
| ACTION_REFERENCE_NEW_TABLE | varchar(64) | YES |     | NULL    |       |
| ACTION_REFERENCE_OLD_ROW   | varchar(3)   | NO   |     |         |       |
| ACTION_REFERENCE_NEW_ROW   | varchar(3)   | NO   |     |         |       |
| CREATED                    | datetime     | YES |     | NULL    |       |
| SQL_MODE                   | longtext     | NO   |     |         |       |
| DEFINER                    | longtext     | NO   |     |         |       |
+----------------------------+--------------+------+-----+---------+-------+

這樣,用戶就可以按照自己的需要,查看觸發(fā)器,比如使用如下語句查看上述觸發(fā)器:

select * from information_schema. TRIGGERS where TRIGGER_NAME= 'trig_useracct_update'\G;

刪除觸發(fā)器。刪除觸發(fā)器語法如下:

DROP TRIGGER [schema_name.]trigger_name


2.2   Msyql觸發(fā)器的trigger_time和trigger_event

現(xiàn)在,重新注意到trigger_time和trigger_event,上文說過, trigger_time可以用before和after替換,表示觸發(fā)器程序的執(zhí)行在sql執(zhí)行的前還是后;trigger_event可以用 insert,update,delete替換,表示觸發(fā)器程序在什么類型的sql下會被觸發(fā)。

在一個表上最多建立6個觸發(fā)器,即1)before insert型,2)before update型,3)before delete型,4)after insert型,5)after update型,6)after delete型。

觸發(fā)器的一個限制是不能同時在一個表上建立2個相同類型的觸發(fā)器。這個限制的一個來源是觸發(fā)器程序體的“begin和end之間允許運(yùn)行多個語句”(摘自mysql使用手冊)。

另外還有一點(diǎn)需要注意,msyql除了對insert,update,delete基本操作進(jìn)行定義外,還定義了load data和replace語句,而load data和replace語句也能引起上述6中類型的觸發(fā)器的觸發(fā)。

Load data語句用于將一個文件裝入到一個數(shù)據(jù)表中,相當(dāng)與一系列insert操作。replace語句一般來說和insert語句很像,只是在表中有 primary key和unique索引時,如果插入的數(shù)據(jù)和原來primary key和unique索引一致時,會先刪除原來的數(shù)據(jù),然后增加一條新數(shù)據(jù);也就是說,一條replace sql有時候等價于一條insert sql,有時候等價于一條delete sql加上一條insert sql。即是:
?   Insert型觸發(fā)器:可能通過insert語句,load data語句,replace語句觸發(fā);
?   Update型觸發(fā)器:可能通過update語句觸發(fā);
?   Delete型觸發(fā)器:可能通過delete語句,replace語句觸發(fā);

3   Mysql觸發(fā)器的執(zhí)行順序

先拋出觸發(fā)器相關(guān)的幾個問題

3.1   如果before類型的觸發(fā)器程序執(zhí)行失敗,sql會執(zhí)行成功嗎?

實(shí)驗(yàn)如下:

1)在FC_Word.planinfo中建立before觸發(fā)器:

DELIMITER |
create trigger trigger_before_planinfo_update
before update
ON FC_Word.planinfo FOR EACH ROW
BEGIN
insert into FC_Output.abc (planid) values (New.planid);
END

|

2)查看:mysql> select showprob from planinfo where planid=1;

+----------+
| showprob |
+----------+
|        2 |
+----------+

3)執(zhí)行sql:

update planinfo set showprob=200 where planid=1;      觸發(fā)觸發(fā)器程序;

4)由于不存在FC_Output.abc,before觸發(fā)器執(zhí)行失敗,提示:

ERROR 1146 (42S02): Table 'FC_Output.abc' doesn't exist

5)再次查看:

mysql> select showprob from planinfo where planid=1;
+----------+
| showprob |
+----------+
|        2 |
+----------+

即修改sql未執(zhí)行成功。即如果before觸發(fā)器執(zhí)行失敗,sql也會執(zhí)行失敗。

3.2   如果sql執(zhí)行失敗,會執(zhí)行after類型的觸發(fā)器程序嗎?

實(shí)驗(yàn)如下:

1)在FC_Word.planinfo中建立after觸發(fā)器:

DELIMITER |
create trigger trigger_after_planinfo_update
after update
ON FC_Word.planinfo FOR EACH ROW
BEGIN
INSERT INTO FC_Output.fcevent set level = 2, type = 2, tabid = 5, userid = NEW.userid, planid = NEW.planid, planstat2 = NEW.planstat2, showprob = NEW.showprob, showrate = NEW.showrate, showfactor = NEW.showfactor, planmode = NEW.planmode;
END

|

2)查看觸發(fā)表:

mysql> select * from FC_Output.fcevent where planid=1;
Empty set (0.00 sec)

沒有planid=1的記錄

3)執(zhí)行sql:

mysql> update planinfo set showprob1=200 where planid=1;

4)由于不存在showprob1列,提示錯誤:

ERROR 1054 (42S22): Unknown column 'showprob1' in 'field list'

5)再次查看觸發(fā)表:

mysql> select * from FC_Output.fcevent where planid=1;
Empty set (0.00 sec)

觸發(fā)表中沒有planid=1的記錄,sql在執(zhí)行失敗時,after型觸發(fā)器不會執(zhí)行。

3.3   如果after類型的觸發(fā)器程序執(zhí)行失敗,sql會回滾嗎?

實(shí)驗(yàn)如下:

1)在FC_Word.planinfo中建立after觸發(fā)器:

DELIMITER |
create trigger trigger_after_planinfo_update
after update
ON FC_Word.planinfo FOR EACH ROW
BEGIN
insert into FC_Output.abc (planid) values (New.planid);
END
|


2)查看:mysql> select showprob from planinfo where planid=1;

+----------+
| showprob |
+----------+
|        2 |
+----------+

3)執(zhí)行sql:

update planinfo set showprob=200 where planid=1;觸發(fā)觸發(fā)器程序;

4)由于不存在FC_Output.abc,after觸發(fā)器執(zhí)行失敗,提示:

ERROR 1146 (42S02): Table 'FC_Output.abc' doesn't exist

5)再次查看:

mysql> select showprob from planinfo where planid=1;
+----------+
| showprob |
+----------+
|        2 |
+----------+

即修改sql未執(zhí)行成功。即如果after觸發(fā)器執(zhí)行失敗,sql會回滾。

這里需要說明一下,上述實(shí)驗(yàn)所使用的mysql引擎是innodb,innodb引擎也是目前線上鳳巢系統(tǒng)、北斗系統(tǒng)以及哥倫布系統(tǒng)所使用的引擎,在 innodb上所建立的表是事務(wù)性表,也就是事務(wù)安全的。“對于事務(wù)性表,如果觸發(fā)程序失敗(以及由此導(dǎo)致的整個語句的失敗),該語句所執(zhí)行的所有更改將回滾。對于非事務(wù)性表,不能執(zhí)行這類回滾”(摘自mysql使用手冊)。因而,即使語句失敗,失敗之前所作的任何更改依然有效,也就是說,對于 innodb引擎上的數(shù)據(jù)表,如果觸發(fā)器中的sql或引發(fā)觸發(fā)器的sql執(zhí)行失效,則事務(wù)回滾,所有操作會失效。

3.4   mysql觸發(fā)器程序執(zhí)行的順序


當(dāng)一個表既有before類型的觸發(fā)器,又有after類型的觸發(fā)器時;當(dāng)一條sql語句涉及多個表的update時,sql、觸發(fā)器的執(zhí)行順序經(jīng)過mysql源碼包裝過,有時比較復(fù)雜。

可以先看一段mysql的源代碼,當(dāng)SQL中update多表的時候,Mysql的執(zhí)行過程如下(省去了無關(guān)代碼):

/* 遍歷要更新的所有表 */
for (cur_table= update_tables; cur_table; cur_table= cur_table->next_local)
{
org_updated = updated
/* 如果有 BEFORE 觸發(fā)器,則執(zhí)行;如果執(zhí)行失敗,跳到err2位置 */
if (table->triggers &&
table->triggers->process_triggers(thd, TRG_EVENT_UPDATE,TRG_ACTION_BEFORE, TRUE))
goto err2;
/*執(zhí)行更新,如果更新失敗,跳到err位置*/
if(local_error=table->file->update_row(table->record[1], table->record[0])))
goto err;
updated++; // 更新計(jì)數(shù)器
/* 如果有 AFTER 觸發(fā)器,則執(zhí)行;如果執(zhí)行失敗,跳到err2位置*/
if (table->triggers &&
table->triggers->process_triggers(thd, TRG_EVENT_UPDATE, TRG_ACTION_AFTER, TRUE))
goto err2;
err:
{
/*標(biāo)志錯誤信息,寫日志等*/
}
err2:
{
/*恢復(fù)執(zhí)行過的操作*/
check_opt_it.rewind();
/*如果執(zhí)行了更新,且表是有事務(wù)的,做標(biāo)志*/
if (updated != org_updated)
{
if (table->file->has_transactions())
transactional_tables= 1;
}
}
}


從上面代碼可以找到本章開始時拋出問題的答案。

1)   如果before型觸發(fā)器執(zhí)行失敗,直接goto跳到err2位置,不會執(zhí)行后續(xù)sql語句;

2)   如果sql執(zhí)行失敗,直接goto跳到err位置,不會執(zhí)行或許的after型觸發(fā)器;

3)   如過after觸發(fā)器執(zhí)行失敗,goto到err2位置,恢復(fù)執(zhí)行過的操作,且在事務(wù)型的表上做標(biāo)記。

另外,在使用復(fù)雜的sql時,由于有些復(fù)雜的sql是mysql自己定義的,所以存在不確定性,使用簡單的sql比較可控。

4   Mysql觸發(fā)器在數(shù)據(jù)庫同步中的表現(xiàn)

4.1   觸發(fā)器運(yùn)行失敗時,數(shù)據(jù)庫同步會失敗嗎?

有同步關(guān)系如下dbA?dbB。初始時同步正常。

1)在dbB上建立觸發(fā)器:

DELIMITER |
create trigger trigger_after_planinfo_update
after update
ON FC_Word.planinfo FOR EACH ROW
BEGIN
insert into FC_Output.abc (planid) values (New.planid);
END
|


2)在dbA上執(zhí)行sql,執(zhí)行成功;

mysql> update planinfo set showprob=200 where planid= 1;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

3)由于dbB上沒有FC_Output.abc表,觸發(fā)器會執(zhí)行失敗,這時,檢查一下同步狀態(tài):

Slave_IO_Running: Yes
Slave_SQL_Running: NO
Last_Errno: 1146
Last_Error: Error 'Table 'FC_Output.abc' doesn't exist' on query. Default database: 'FC_Word'. Query: 'update planinfo set showprob=200 where planid= 1'

可以看到IO線程運(yùn)行正常,sql線程運(yùn)行失敗,并提示觸發(fā)器運(yùn)行失敗的錯誤信息。

回憶一下3.1和3.3所述部分,無論是before部分的觸發(fā)器還是after類型的觸發(fā)器,對于innodb引擎,當(dāng)觸發(fā)器執(zhí)行失敗時,相應(yīng)sql也會執(zhí)行失敗,所以數(shù)據(jù)庫同步也會失敗。

4.2   創(chuàng)建、刪除觸發(fā)器寫bin-log

創(chuàng)建和刪除觸發(fā)器的語句也會寫入bin-log里,所以也會如一般的insert,update,delete語句一樣同步到下游數(shù)據(jù)庫中,即上游創(chuàng)建觸發(fā)器,下游也會創(chuàng)建。

這里再引出兩個小問題:有同步關(guān)系dbA?dbB,

1)   在dbA上創(chuàng)建一個觸發(fā)器,如果dbB上已經(jīng)有同表同類型的觸發(fā)器,同步狀態(tài)如何?

2)   在dbB上刪除一個觸發(fā)器,如果dbB上沒有對應(yīng)觸發(fā)器,同步狀態(tài)如何?

這兩個問題可以類比同步中的insert語句和delete語句,答案就是

1)   同步失敗,因?yàn)椴辉试S重復(fù)創(chuàng)建同表同類型的觸發(fā)器;

2)   同步正常,因?yàn)閐rop一個不存在的觸發(fā)器,不影響運(yùn)行結(jié)果;

5   Mysql觸發(fā)器經(jīng)典案例

5.1   案例1 一條sql涉及多個表的update時,觸發(fā)得到update之前的舊值

【現(xiàn)象】表test_info上建有觸發(fā)器如下:

CREATE /*!50017 DEFINER = 'root'@'localhost' */ TRIGGER trig_test_info_update
AFTER UPDATE
ON FC_Word.test_info FOR EACH ROW
BEGIN
DECLARE tlevel INTEGER DEFAULT 0;
DECLARE ttype INTEGER DEFAULT 0;
SET tlevel = 4;
SET ttype = 33;
INSERT INTO TEST_Output.fcevent (te, le, uid, pid, uid, wid, bi, mbid, wl) SELECT ttype, tlevel, NEW.uid, NEW.pid, NEW.uid, NEW.wid, NEW.bi, NEW.mbid, wl FROM TEST_Word.wext2 where wid = NEW.wid;
/*。。。其余部分邏輯省略*/
END IF;
END;


這個觸發(fā)器程序有點(diǎn)長,可以單看飄黃的兩句,即更新操作滿足第一個條件執(zhí)行飄黃語句時,觸發(fā)器的行為。觸發(fā)器是建立在test_info表上的,飄黃語句中可以看到,也需要查詢wext2表。

執(zhí)行如下sql1:

Update test_info a, wext2 b set a.th=(a.th+1), a.w4=(a.w4&8), b.wl=NULL where a.wid=b.wid and a.wid=142394379;

可以看到sql中既修改了test_info2表,同時修改了wext2表,程序原意是觸發(fā)得到wext2表wl字段修改后的新值(即NULL);不過實(shí)驗(yàn)得到,執(zhí)行上述sql后,觸發(fā)器程序查詢到的wurl是sql修改之前的舊值。

再執(zhí)行下面類似sql2:

Update wext2 a, test_info2 b set b.th=(b.th+1), b.w4=(b.w4&8), a.wl=NULL where a.wid=b.wid and a.wid=142394379;

實(shí)驗(yàn)的到,執(zhí)行上述sql后,觸發(fā)器程序查詢到的wurl是sql修改之后的新值。

【原因】原因當(dāng)然與sql中的別名a,b無關(guān),而是和wext2表和test_info表的書寫順序有關(guān)。如本文3.4部分所述,一條sql涉及多個表的 update操作時,數(shù)據(jù)表字段、觸發(fā)器執(zhí)行順序是mysql源碼包裝過的。在執(zhí)行上述sql1時,先執(zhí)行test_info的更新,然后是after觸發(fā)器,最后是wext2的更新,也就是說,在執(zhí)行after觸發(fā)器時,wext2還沒有進(jìn)行更新,所以觸發(fā)得到的是舊值。而執(zhí)行sql2時,先執(zhí)行 wext2更新,然后是test_info更新,最后是after觸發(fā)器,也就是說,在執(zhí)行after觸發(fā)器時,wext2已經(jīng)更新完畢,所以出去得到的是新值。

引起上述現(xiàn)象是順序關(guān)系的,無論該表是否支持事務(wù)。在使用復(fù)雜的sql時,由于有些復(fù)雜的sql是mysql自己定義的,所以存在不確定性,存在風(fēng)險(xiǎn),使用簡單的sql比較可控。

5.2   案例2 mysql5.0.19版本修改表結(jié)構(gòu)后觸發(fā)器失效

【現(xiàn)象】userpref表上建有after類型觸發(fā)器,修改userpref表的外鍵關(guān)聯(lián)后,在userpref表中的新增記錄沒有觸發(fā)下來,即觸發(fā)器失效。

【原因】mysql5.0.19修改表結(jié)構(gòu)是,觸發(fā)器消失。這是mysql5.0.19的一個bug,在創(chuàng)建觸發(fā)器時,會把觸發(fā)器的內(nèi)容保存在 information_schema.TRIGGERS表中,同時在var目錄下創(chuàng)建觸發(fā)器的數(shù)據(jù)庫目錄下創(chuàng)建一個觸發(fā)器名稱為前綴,以TRN為后綴的文件,當(dāng)修改觸發(fā)器的表時,information_schema.TRIGGERS表的內(nèi)容會刪除,導(dǎo)致觸發(fā)器消失。

在mysql5.0.45版本中,這個bug已經(jīng)被修復(fù)。Mysql5.0.45版本的觸發(fā)器,無論是修改表的索引、外鍵,還是改變表字段,觸發(fā)器都不會失效。

5.3   案例3 刪除數(shù)據(jù)表后觸發(fā)器失效

【現(xiàn)象】聯(lián)調(diào)環(huán)境中存在dbA?dbB,主庫dbA上沒有觸發(fā)器,在從庫dbB上的FC_Word.wnegative表,F(xiàn)C_Word.wbuget 表上建有觸發(fā)器;觸發(fā)器開始運(yùn)行正常,期間沒有對從庫的任何直接操作,有一日發(fā)現(xiàn)對wnegative表上的修改無法觸發(fā)。查看從庫狀態(tài),同步正常;用 select TRIGGER_NAME from information_schema.TRIGGERS發(fā)現(xiàn)wnegative表上的觸發(fā)器消失了;在var/FC_Word目錄下也沒有 wnegative的.TRN文件,wnegative表上的觸發(fā)器不見了。

【分析】查找dbB的查詢?nèi)罩荆l(fā)現(xiàn)有一條:

100223 18:27:45 135939 Query       DROP TABLE IF EXISTS `wnegative`
135939 Query       CREATE TABLE `wnegative` (
KEY `Index_wnegative_planid` (`planid`),
KEY `Index_wnegative_unitid` (`unitid`)
135939 Query       /*!40000 ALTER TABLE `wnegative` DISABLE KEYS */
100223 18:27:46 135939 Query       INSERT INTO `wnegative` VALUES (614,1,289026,2911155,1848481);

可以看到,在100223 18:27:45時,刪除了表wnegative,緊接著有創(chuàng)建表wnegative;查找觸發(fā)表發(fā)現(xiàn),在100223 18:27:45時間后對wnegative的修改就沒有觸發(fā)了,而在這個之前對wnegative的修改是觸發(fā)正常的。故,懷疑對wnegative表的刪除使wnegative表上的觸發(fā)器也被刪除。對wnegative表的刪除是在主庫dbA上操作后,被同步到dbB上。

【原因】在刪除wnegative表時,mysql同時刪除了wegative表上的觸發(fā)器。

可以通過下面實(shí)驗(yàn)證明上述猜測:

1)   首先在wnegative建立after insert型觸發(fā)器;
2)   增加一條wnegative中記錄;
3)   查看結(jié)果發(fā)現(xiàn)觸發(fā)器正確觸發(fā);
4)   刪除wnegative表;
5)   使用select TRIGGER_NAME from information_schema.TRIGGERS查看所有觸發(fā)器,wnegative表上觸發(fā)器已經(jīng)不存在了;同時到var/FC_Word目錄下,對應(yīng)觸發(fā)器的.TRN文件也不存在了;
6)   重新創(chuàng)建wnegative表,并增加一條wnegative中記錄;沒有了wnegative表上觸發(fā)器,自然也不能觸發(fā)任何結(jié)果。

6   結(jié)束語

Mysql中的觸發(fā)器功能已經(jīng)在鳳巢系統(tǒng)的各個模塊中有廣泛應(yīng)用,究其細(xì)節(jié),還有很多值得注意的地方;本文建立在實(shí)驗(yàn)和案例的基礎(chǔ)上,數(shù)據(jù)庫基于線上系統(tǒng)使用的mysql5.0.45版本,分析了觸發(fā)器相關(guān)的一些特殊情況下msyql的處理方式。

(全文完)

posted on 2012-01-16 13:04 小果子 閱讀(7210) 評論(1)  編輯 收藏 引用 所屬分類: 學(xué)習(xí)筆記SQL

FeedBack:
# re: mysql 觸發(fā)器
2012-07-30 10:12 | 阿薩
[fts=6][ftc=#ED008C][ftf=Webdings]Y[/ft][/ft]
[fts=5][ftc=#EF6EA8][ftf=Webdings]Y[/ft][/ft][/ft]
[fts=4] [ftc=#F49BC1][ftf=Webdings]Y[/ft][/ft][/ft]
[fts=3][ftc=#FCE1EC][ftf=Webdings]Y[/ft][/ft] [/ft][fts=3][ftc=#FCE1EC][ftf=Webdings]Y[/ft][/ft] [/ft][/ft]
[fts=4] [ftc=#F49BC1][ftf=Webdings]Y[/ft][/ft][/ft] [ftc=#F49BC1] ━━━━━━━━━━━━[/ft][ftf=Webdings]=[/ft][/ft][ftc=#EF6EA8][ftf=Webdings]=[/ft][/ft][ftc=#F49BC1]━━━━[/ft] [fts=4] [ftc=#F49BC1][ftf=Webdings]Y[/ft][/ft][/ft]
[ftc=#6CCFF7] 江小南、有你的每一天才是幸福。[/ft]
 [ftc=#91278F]━─━─━─━─━─━─━─━●●━─━─━─━─━─━─━
[ffg,#A286BD,#FFFFFF] [M][fts=6][ftf=Comic Sans MS]L[/ft][ftf=Webdings][ftc=#F49BC1]Y[/ft][/ft][ftf=Comic Sans MS]veY[/ft][ftf=Webdings][ftc=#F49BC1]Y[/ft][/ft][ftf=Comic Sans MS]υ![/ft][/ft] 
  回復(fù)  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久精品一级爱片| 麻豆av一区二区三区| 欧美一区二区三区日韩| 亚洲免费久久| 亚洲精品国产精品国产自| 亚洲国产欧美不卡在线观看| 亚洲精品久久久久久久久久久久久 | 欧美日韩爆操| 欧美精品aa| 欧美三级欧美一级| 国产丝袜美腿一区二区三区| 免费在线看成人av| 免费成人av在线看| 香蕉精品999视频一区二区| 夜夜嗨一区二区| 91久久久一线二线三线品牌| 国内不卡一区二区三区| 国产精品成人aaaaa网站| 亚洲乱码国产乱码精品精 | 国产亚洲欧美一区| 国产一区91| 亚洲伦理在线免费看| 一本色道久久88综合亚洲精品ⅰ | 亚洲国产精品一区在线观看不卡| 国产日韩一级二级三级| 国产自产精品| 黄色国产精品一区二区三区| 亚洲每日更新| 久久久国产精品一区二区三区| 久久久综合网站| 欧美午夜在线视频| 亚洲第一精品夜夜躁人人爽| 亚洲免费中文| 亚洲免费电影在线观看| 久久久精品国产免大香伊| 久久久成人精品| 久久久99爱| 亚洲免费在线视频| 欧美大片免费观看| 激情欧美丁香| 老司机精品视频一区二区三区| 一区二区三区欧美在线| 欧美精品自拍| 亚洲国产精品成人久久综合一区| 欧美一二三区在线观看| 亚洲人成网站777色婷婷| 午夜欧美视频| 国产伦精品一区二区三区四区免费| 一本大道久久a久久精品综合| 亚洲国产精品成人综合| 美女91精品| 亚洲福利一区| 亚洲人成免费| 国产精品国产三级国产普通话99 | 久久国产精品久久久久久电车| 欧美成年人视频网站| 日韩视频不卡中文| 欧美国产日产韩国视频| 欧美成人精品高清在线播放| 久久综合激情| 一区二区三区三区在线| 伊人精品成人久久综合软件| 久久亚洲精品一区二区| 欧美成人免费在线视频| 99这里只有精品| 亚洲图中文字幕| 亚洲国产欧美不卡在线观看| 欧美成人免费在线观看| 午夜精品国产更新| 久久久xxx| 久久久久久久999精品视频| 国产午夜精品一区理论片飘花| 欧美日韩亚洲成人| 性欧美xxxx视频在线观看| 免费成人黄色片| 午夜精品一区二区三区在线| 久久婷婷国产麻豆91天堂| 欧美一区1区三区3区公司| 麻豆精品在线播放| 久久亚洲精品网站| 国产美女精品人人做人人爽| 亚洲精品一区二区三区不| 国模精品一区二区三区| 欧美亚洲一级片| 亚洲女优在线| 国产精品久久久久9999高清| 亚洲精品乱码久久久久| 99re6这里只有精品视频在线观看| 欧美一区二区免费| 欧美激情第二页| 亚洲精品一二| 美腿丝袜亚洲色图| 亚洲电影在线免费观看| 亚洲精品一区二区在线| 欧美日本不卡视频| 一区二区欧美日韩| 亚洲视频在线播放| 欧美日韩1234| 亚洲欧美在线另类| 久久资源在线| 一区二区高清视频| 国产女主播一区二区三区| 久久手机免费观看| 亚洲色在线视频| 玖玖在线精品| 欧美二区在线看| 欧美在线91| 亚洲福利在线视频| 欧美一级专区| 一本久道久久久| 亚洲国产欧美一区二区三区同亚洲| 久久精品男女| 正在播放亚洲一区| 免费成人激情视频| 久久这里有精品15一区二区三区| 亚洲视频1区| 亚洲日本精品国产第一区| 国产三级精品在线不卡| 国产精一区二区三区| 牛牛国产精品| 欧美肥婆bbw| 欧美片在线播放| 久久人人97超碰精品888| 亚洲欧美久久久| 亚洲欧美日韩在线一区| 亚洲色在线视频| 亚洲一区二区高清视频| 亚洲精品乱码久久久久久黑人| 欧美成人免费网| 99在线精品视频| 99成人精品| 久久精品人人做人人爽| 欧美一区二区免费视频| 久久人人九九| 欧美黄色aa电影| 国产精品久久91| 免费日韩av| 亚洲第一二三四五区| 亚洲国产清纯| 母乳一区在线观看| 1024精品一区二区三区| 久久精精品视频| 久久精品国产第一区二区三区最新章节 | 亚洲国产精品一区二区第一页| 亚洲人成人一区二区在线观看| 亚洲片在线资源| 久久久久久亚洲精品中文字幕 | 亚洲成人在线网| 亚洲在线国产日韩欧美| 老巨人导航500精品| 国产精品国产三级国产普通话三级 | 国产精品色婷婷| 一区在线视频| 亚洲欧美日韩在线观看a三区| 欧美freesex交免费视频| 亚洲欧美精品suv| 国产精品久久午夜夜伦鲁鲁| 亚洲人成网在线播放| 欧美插天视频在线播放| 午夜一区在线| 国产免费亚洲高清| 欧美一区二区三区在线看| 亚洲一区日韩在线| 欧美日一区二区在线观看| 亚洲免费高清| 亚洲精品美女91| 欧美日韩国产首页| 亚洲午夜一区二区三区| 亚洲国产日韩欧美一区二区三区| 男女视频一区二区| 最新国产成人在线观看| 亚洲毛片在线看| 一区二区三区免费观看| 欧美激情久久久久| 亚洲在线免费视频| 欧美日韩一区二区在线视频 | 亚洲女女女同性video| 欧美成年人网站| 亚洲欧美综合国产精品一区| 亚洲一区二区在线免费观看视频 | 久久久久久久一区二区| 亚洲国产精品一区| 亚洲一区二区黄| 在线观看亚洲精品| 日韩一级精品视频在线观看| 国产精品久久久久久av福利软件| 午夜精品久久久久久久男人的天堂| 午夜精品久久久久久99热| 亚洲日本视频| 亚洲欧美激情四射在线日 | 亚洲一级在线观看| 国产在线日韩| 亚洲国产一区在线观看| 国产亚洲一本大道中文在线| 亚洲精品久久久久久下一站| 在线观看视频一区| 久久精品99久久香蕉国产色戒| 亚洲无线一线二线三线区别av| 噜噜噜躁狠狠躁狠狠精品视频 | 中文精品视频|