?? 12-3-3.cfm.htm
字號:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>使用Inserted和Deleted表</title>
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
</head>
<body>
<b><font FACE="宋體">
<p ALIGN="JUSTIFY">使用</font>Inserted<font FACE="宋體">和</font>Deleted<font
FACE="宋體">表</p>
</font></b><font FACE="宋體" SIZE="3">
<p ALIGN="JUSTIFY">我們這里介紹兩個特殊的表,Inserted表和Deleted表。此二表僅僅在觸發器運行時存在。你可以使用該兩個表來精確地確定觸發觸發器的動作對數據表所做的修改。比如,通過檢查Deleted表,你可以確定那些記錄由某一動作刪除。考慮下面的例子:</p>
<p ALIGN="JUSTIFY">CREATE TRIGGER tr_webusers_delete ON webusers</p>
<p ALIGN="JUSTIFY">FOR DELETE</p>
<p ALIGN="JUSTIFY">AS</p>
<p ALIGN="JUSTIFY">INSERT weblog (activity) SELECT user_name FROM Deleted</p>
<p ALIGN="JUSTIFY">該觸發器自動地創建一個webusers表的記錄。當在webusers表內刪除一個用戶的姓名時,觸發器會自動地把該姓名插入到weblog表中。假設你一不小心執行了下面的語句:</p>
<p ALIGN="JUSTIFY">DELETE webusers</p>
<p ALIGN="JUSTIFY">該語句會刪除在webusers表內的所有記錄。一般地,這些記錄會永久地丟失,然而上面的觸發器會在有記錄從webusers表中刪除時自動的觸發。該觸發器會檢查表Deleted來確定有那些在webusers表內的記錄被刪除,并且把所有刪除了的記錄拷貝到weblog表中。</p>
<p ALIGN="JUSTIFY">為了恢復那些意外被刪除的記錄,你可以使用INSERT和SELECT語句再一次把它們從weblog表中拷貝到webusers表中。如果你不能允許意外地丟失一條記錄時,你可以使用上面的方法來創建一個表內數據的備份。</p>
<p ALIGN="JUSTIFY">Deleted表和有記錄被刪除的表的列結構一模一樣。在前面的例子內,Deleted表具有和webusers表相同的結構。</p>
<p ALIGN="JUSTIFY">現在假定你想跟蹤所有插入某一表格的記錄。比如,你想把每一條插入webusers表內的記錄都在weblog表內做備份,你可以使用下面的觸發器來完成該任務:</p>
<p ALIGN="JUSTIFY">CREATE TRIGGER tr_webusers_insert ON webusers</p>
<p ALIGN="JUSTIFY">FOR INSERT</p>
<p ALIGN="JUSTIFY">AS </p>
<p ALIGN="JUSTIFY">INSERT weblog(activty) SELECT user_name FROM INSERTED</p>
<p ALIGN="JUSTIFY">該觸發器和前面的觸發器非常相似,除了以下兩點以外:</p>
<blockquote>
<p ALIGN="JUSTIFY">該觸發器在有記錄插入表格webusers時觸發;該觸發器是FOR
INSERT。</p>
<p ALIGN="JUSTIFY">該觸發器把記錄從Inserted表拷貝到weblog表內。</p>
</blockquote>
<p ALIGN="JUSTIFY">Inserted表內包含了所有已經插入到表內的新記錄。假如一個新用戶的姓名插入到webusers表內時,觸發器會自動地把新的用戶姓名從webusers表拷貝到weblog表內。</p>
<p ALIGN="JUSTIFY">當你想使用一個簡單的表來記錄所有發生在你數據庫中一個非常重要的表的動作時,這種復制數據的方法非常有用。你可以使用該表來獲得對你的數據庫的活動的記錄,并且可以用于記錄和診斷一些可能發生的問題。</p>
<p ALIGN="JUSTIFY">你同樣可以使用Inserted表和Deleted表來記錄UPDATE對觸發器所在的表所做的改動。當一個和觸發器相關的表內的數據被修改時,Deleted表包含了所有列在修改之前的值,而Inserted表包含了所有列在修改之后的值。參看下面的表12.2,以明確每一個動作是如何影響Deleted和Inserted表的。</p>
<b>
<p ALIGN="JUSTIFY">表12.2.Inserted和Deleted表的內容</p>
</b></font><div align="center"><center>
<table BORDER="1" CELLSPACING="2" BORDERCOLOR="#007f00" CELLPADDING="7" WIDTH="516">
<tr>
<td WIDTH="21%" VALIGN="TOP"><font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">表</font></td>
<td WIDTH="28%" VALIGN="TOP"><font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">INSERT</font></td>
<td WIDTH="28%" VALIGN="TOP"><font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">DELETE</font></td>
<td WIDTH="23%" VALIGN="TOP"><font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">UPDATE</font></td>
</tr>
<tr>
<td WIDTH="21%" VALIGN="TOP"><font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">Inserted</font></td>
<td WIDTH="28%" VALIGN="TOP"><font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">插入列</font></td>
<td WIDTH="28%" VALIGN="TOP"><font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">空</font></td>
<td WIDTH="23%" VALIGN="TOP"><font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">修改前的列</font></td>
</tr>
<tr>
<td WIDTH="21%" VALIGN="TOP"><font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">Deleted</font></td>
<td WIDTH="28%" VALIGN="TOP"><font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">空</font></td>
<td WIDTH="28%" VALIGN="TOP"><font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">刪除列</font></td>
<td WIDTH="23%" VALIGN="TOP"><font FACE="宋體" SIZE="3"><p ALIGN="JUSTIFY">修改后的列</font></td>
</tr>
</table>
</center></div><font FACE="宋體" SIZE="3">
<p ALIGN="JUSTIFY">Inserted表和Deleted表僅僅在觸發器在執行時存在,這一點是非常重要的,我們一定要明確。它們在某一特定時間和某一特定表相關。一旦某一個觸發器結束執行時,相應的在兩個表內的數據都會丟失。如果你想創建一個在任意一個這些表內數據的永久拷貝,你需要在觸發器內把這些表內的數據拷貝到一個永久的表內。</p>
</font>
</body>
</html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -