?? 12-3-1.cfm.htm
字號:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>使用觸發(fā)器</title>
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
</head>
<body>
<font FACE="宋體" SIZE="5"><b>
<p ALIGN="JUSTIFY">使用觸發(fā)器</p>
</b></font><font FACE="宋體" SIZE="3">
<p ALIGN="JUSTIFY">觸發(fā)器是一系列當(dāng)在表中的數(shù)據(jù)修改時要執(zhí)行的SQL語句的集合。你可以創(chuàng)建一些當(dāng)在表中的數(shù)據(jù)在插入,修改或刪除時觸發(fā)的觸發(fā)器。在本節(jié)中,你將學(xué)習(xí)如何創(chuàng)建和使用觸發(fā)器。</p>
</font><b><font FACE="宋體">
<p ALIGN="JUSTIFY">使用命令</font>CREATE TRIGGER<font FACE="宋體">來創(chuàng)建觸發(fā)器</p>
</font></b><font FACE="宋體" SIZE="3">
<p ALIGN="JUSTIFY">你可以使用語句CREATE TRIGGER來創(chuàng)建一個觸發(fā)器。與存儲過程不同,每個觸發(fā)器都必須和某一個特定的表相關(guān),而且每一個觸發(fā)器都只和作用于該表上的一個或多個動作有關(guān),下面就是CREATE
TRIGGER語句的一個簡單例子:</p>
<p ALIGN="JUSTIFY">CREATE TRIGGER tr_webusers_insert ON webusers FOR INSERT AS </p>
<p ALIGN="JUSTIFY">EXECUTE master..xp_sendmail </font><font SIZE="3">“</font><font
FACE="宋體" SIZE="3">administrator</font><font SIZE="3">”</font><font FACE="宋體"
SIZE="3"> </font><font SIZE="3">“</font><font FACE="宋體" SIZE="3">New user
registered!</font><font SIZE="3">”</p>
</font><font FACE="宋體" SIZE="3">
<p ALIGN="JUSTIFY">該觸發(fā)器的名稱為tr_webusers_insert。你可以使用任何你想用的名稱來命名觸發(fā)器,但是每個觸發(fā)器都必須有唯一的名稱。在觸發(fā)器的名稱內(nèi)包含和觸發(fā)器相關(guān)聯(lián)的表和動作作為觸發(fā)器名稱的一部分是一個很好的主意。</p>
<p ALIGN="JUSTIFY">在CREATE TRIGGER語句中等ON短語用于指明和觸發(fā)器相關(guān)聯(lián)的數(shù)據(jù)表。本例子中的觸發(fā)器和表webusers相關(guān)聯(lián),它會在該表中的數(shù)據(jù)變動時觸發(fā)。</p>
<p ALIGN="JUSTIFY">FOR短語指明會觸發(fā)該觸發(fā)器的動作。在本例子中,觸發(fā)器會在有任何新的數(shù)據(jù)添加入該表時被觸發(fā)。同樣的,你可以創(chuàng)建一個在表內(nèi)的數(shù)據(jù)進(jìn)行更新或刪除時觸發(fā)的觸發(fā)器,你只需要使用關(guān)鍵詞UPDATE或DELETE。</p>
<p ALIGN="JUSTIFY">在AS短語后面,你可以列出一個或多個SQL短語。在本例子中,觸發(fā)器僅包含一個單獨的語句。當(dāng)有新的記錄添加到表webusers中時,管理員會自動發(fā)送Email信息,New
User registered!</p>
<p ALIGN="JUSTIFY">對于觸發(fā)器,請牢記以下重要幾點:</p>
<blockquote>
<p ALIGN="JUSTIFY">觸發(fā)器和某一指定的表格有關(guān),當(dāng)該表格備刪除時,任何與該表有關(guān)的觸發(fā)器同樣會被刪除。比如,當(dāng)表格webusers被刪除時,觸發(fā)器tr_webusers_insert也同樣會被刪除。</p>
<p ALIGN="JUSTIFY">在一個表上的每一個動作只能有一個觸發(fā)器與之關(guān)聯(lián)。例如:你不能在表webusers上創(chuàng)建第二個觸發(fā)器,該觸發(fā)器在有數(shù)據(jù)插入表中時觸發(fā)。</p>
<p ALIGN="JUSTIFY">在一個單獨的表上,你最多只能創(chuàng)建三個觸發(fā)器與之關(guān)聯(lián),一個INSERT觸發(fā)器,一個DELETE觸發(fā)器和一個UPDATE觸發(fā)器。</p>
<p ALIGN="JUSTIFY">當(dāng)你添加第二個由相同動作觸發(fā)的觸發(fā)器時,第一個觸發(fā)器會在沒有任何警告信息的條件下被刪除。這是件非常令人煩惱的事情。所以必須仔細(xì)地記錄你的觸發(fā)器信息,以防止該類事情的發(fā)生。</p>
</blockquote>
<b>
<p ALIGN="JUSTIFY">注意</p>
</b></font><font SIZE="3">
<p ALIGN="JUSTIFY"></font><font FACE="宋體" SIZE="3">要觀看所有在當(dāng)前數(shù)據(jù)庫中的觸發(fā)器列表。你可以使用系統(tǒng)存儲過程</font><font
SIZE="3">sp_help</font><font FACE="宋體" SIZE="3">。假如你不加任何修改地執(zhí)行</font><font
SIZE="3">sp_help</font><font FACE="宋體" SIZE="3">,該過程將會顯示在當(dāng)前的數(shù)據(jù)庫中所有的過程,觸發(fā)器及表。假如在觸發(fā)器后面跟上一個指定的觸發(fā)器名稱(比如</font><font
SIZE="3"> sp_help tr_webusers_insert</font><font FACE="宋體" SIZE="3">),</font><font
SIZE="3">sp_help</font><font FACE="宋體" SIZE="3">將會只顯示和該觸發(fā)器有關(guān)的信息。</p>
<p ALIGN="JUSTIFY">你可以讓一個觸發(fā)器和一個單獨的表中多于一個的動作關(guān)聯(lián)。比如你可以修改上面例子中的觸發(fā)器,使其在表中的數(shù)據(jù)在添加或更新時觸發(fā)。下面就是你修改后的結(jié)果:</p>
<p ALIGN="JUSTIFY">CREATE TRIGGER tr_webusers ON webusers FOR INSERT,DELETE AS </p>
<p ALIGN="JUSTIFY">EXECUTE master..xp_sendmail </font><font SIZE="3">“</font><font
FACE="宋體" SIZE="3">administrator</font><font SIZE="3">”</font><font FACE="宋體"
SIZE="3"> </font><font SIZE="3">“</font><font FACE="宋體" SIZE="3">User registered or
modified!</font><font SIZE="3">”</p>
</font><font FACE="宋體" SIZE="3">
<p ALIGN="JUSTIFY">在你創(chuàng)建了觸發(fā)器后,你可以使用系統(tǒng)存儲過程sp_helptext來觀看包含在觸發(fā)器中的語句。該過程顯示觸發(fā)器的文本。例如:命令
sp_helptext tr_webusers會顯示下面的結(jié)果:</p>
<p ALIGN="JUSTIFY">text</p>
</font><font SIZE="3">
<p ALIGN="JUSTIFY">………………………………………</font><font FACE="宋體"
SIZE="3">..</p>
<p ALIGN="JUSTIFY">CREATE TRIGGER tr_webusers ON webusers FOR INSERT,DELETE AS </p>
<p ALIGN="JUSTIFY">EXECUTE master..xp_sendmail </font><font SIZE="3">“</font><font
FACE="宋體" SIZE="3">administrator</font><font SIZE="3">”</font><font FACE="宋體"
SIZE="3"> </font><font SIZE="3">“</font><font FACE="宋體" SIZE="3">User registered or
modified!</font><font SIZE="3">”</p>
</font><font FACE="宋體" SIZE="3">
<p ALIGN="JUSTIFY">觸發(fā)器只有在其FOR短語后面指定的動作發(fā)生時執(zhí)行。你不能直接執(zhí)行一個觸發(fā)器。你不能直接執(zhí)行一個觸發(fā)器。比如說假如你嘗試執(zhí)行tr_webusers時,你會得到如下的錯誤信息:</p>
<p ALIGN="JUSTIFY">The request for procedure </font><font SIZE="3">‘</font><font
FACE="宋體" SIZE="3">tr_webusers</font><font SIZE="3">’</font><font FACE="宋體"
SIZE="3"> failed because </font><font SIZE="3">‘</font><font FACE="宋體" SIZE="3">tr_webusers</font><font
SIZE="3">’</font><font FACE="宋體" SIZE="3"> is a trigger object</p>
<p ALIGN="JUSTIFY">有三種方法可以破壞一個觸發(fā)器,你可以使用命令DROP
TRIGGER后面跟觸發(fā)器的名稱來顯式地刪除一個觸發(fā)器。比如,下面的語句刪除觸發(fā)器tr_webusers。</p>
<p ALIGN="JUSTIFY">DROP TRIGGER tr_webusers</p>
<p ALIGN="JUSTIFY">當(dāng)數(shù)據(jù)表被刪除時,與之相關(guān)的觸發(fā)器會自動地被刪除了。例如,當(dāng)表webusers被刪除時,觸發(fā)器tr_webusers會自動被刪除掉。</p>
<p ALIGN="JUSTIFY">最后,當(dāng)一個新的在同一個表中與同一動作相關(guān)聯(lián)的觸發(fā)器創(chuàng)建時,舊的觸發(fā)器會被自動刪除。例如,當(dāng)觸發(fā)器tr_webusers創(chuàng)建時,觸發(fā)器tr_erbusers_insert會自動地被刪除掉。這是因為兩個觸發(fā)器都由同一個數(shù)據(jù)表的INSERT動作觸發(fā)。</p>
</font><b><font SIZE="3">
<p ALIGN="JUSTIFY"> </p>
</font><font FACE="宋體" SIZE="3">
<p ALIGN="JUSTIFY">注意</p>
</font></b><font SIZE="3">
<p ALIGN="JUSTIFY"></font><font FACE="宋體" SIZE="3">如果觸發(fā)器</font><font
SIZE="3">tr_webusers</font><font FACE="宋體" SIZE="3">在觸發(fā)器</font><font SIZE="3">tr_webusers_insert</font><font
FACE="宋體" SIZE="3">之前創(chuàng)建。觸發(fā)器</font><font SIZE="3">tr_webusers</font><font
FACE="宋體" SIZE="3">只會被部分刪除,這是因為觸發(fā)器</font><font SIZE="3">tr_webusers</font><font
FACE="宋體" SIZE="3">由</font><font SIZE="3">INSERT</font><font FACE="宋體" SIZE="3">和</font><font
SIZE="3">UPDATE</font><font FACE="宋體" SIZE="3">觸發(fā)。觸發(fā)器將在有數(shù)據(jù)更新時繼續(xù)觸發(fā)。然而觸發(fā)器將不會在有數(shù)據(jù)添加時觸發(fā)。新的觸發(fā)器</font><font
SIZE="3">tr_webusers_insert</font><font FACE="宋體" SIZE="3">會取代該任務(wù)。</p>
</font>
</body>
</html>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -