簡(jiǎn)介
當(dāng)特定事件在 IBM® DB2® Universal Database™ 數(shù)據(jù)庫(kù)中發(fā)生時(shí),您就可以激活 觸發(fā)器來(lái)執(zhí)行其他一些操作。在本文中,您將在觸發(fā)器的世界里遨游,看看如何通過(guò)觸發(fā)器來(lái)增強(qiáng)數(shù)據(jù)庫(kù)中的業(yè)務(wù)規(guī)則。您還將學(xué)習(xí)如何使用 DB2 UDB Version 8.1 的控制中心來(lái)幫助您創(chuàng)建一個(gè)應(yīng)用于簡(jiǎn)單業(yè)務(wù)場(chǎng)景的簡(jiǎn)單觸發(fā)器。
什么是觸發(fā)器
當(dāng)一個(gè)指定的 SQL 操作(如 DELETE,INSERT,或者是 UPDATE 操作)作用于某張表時(shí),一個(gè)定義了一組操作的觸發(fā)器就可以被激活。觸發(fā)器并不像參照完整性約束和檢查約束那樣,我們甚至可以使用對(duì)其他表來(lái)進(jìn)行更新。
業(yè)務(wù)場(chǎng)景
將一項(xiàng)技術(shù)應(yīng)用于真實(shí)世界的一個(gè)場(chǎng)景總是有益的。出于教學(xué)的目的,讓我們?cè)谝粋€(gè)銀行相關(guān)環(huán)境中研究觸發(fā)器,在該模擬環(huán)境中,我們僅僅建立了一張表。再次強(qiáng)調(diào),這是被簡(jiǎn)化了的!我們將要做的是,運(yùn)用觸發(fā)器來(lái)促進(jìn)銀行提供的透支保護(hù)。例如,一個(gè)銀行客戶有一個(gè)支票帳戶(checking account)和一個(gè)儲(chǔ)蓄帳戶(saving account)。當(dāng)從支票帳戶中取款的金額超過(guò)了該帳戶的余額時(shí),就會(huì)發(fā)生一次自動(dòng)的轉(zhuǎn)帳(叫做透支保護(hù)),即自動(dòng)從客戶的儲(chǔ)蓄帳戶轉(zhuǎn)帳過(guò)來(lái)。當(dāng)然,這必須符合一定的條件,即儲(chǔ)蓄帳戶中必須有足夠多的錢來(lái)補(bǔ)償透支的金額。
開(kāi)始
像上面所提及的,我們的銀行僅僅包含一張表。在這張表中,我們將存入客戶的支票帳戶和儲(chǔ)蓄帳戶的余額等信息。每個(gè)客戶通過(guò)其社會(huì)保險(xiǎn)號(hào)碼來(lái)標(biāo)識(shí)。下面是對(duì)該表的描述:
表 1. 對(duì) ACCTTABLE 的描述
Column Name Column Type Nullable? SSN*Varchar(11)NOLastNameVarchar(30)NOFirstNameVarchar(30)NOSavingBalanceDecimal (Precision: 7, Scale: 2)NOCheckingBalanceDecimal (Precision: 7, Scale: 2)NO* 表示主鍵
請(qǐng)使用 DB2 命令行處理器為上面的表創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)。將數(shù)據(jù)庫(kù)命名為 bnkdb。
db2 => create database bnkdb
接下來(lái),連接到該數(shù)據(jù)庫(kù)。我假設(shè)您已經(jīng)在您的機(jī)器上有了一個(gè)用戶名為 db2admin , 密碼為 db2admin 的帳號(hào)。
db2 => connect to bnkdb user db2admin using db2admin
現(xiàn)在,創(chuàng)建 accttable 表:
db2 => create table accttable(ssn varchar(30) not null primary key, lastname varchar(30) not null, firstname varchar(30) not null, savingbalance decimal(7,2) not null, checkingbalance decimal(7,2) not null)
現(xiàn)在向所創(chuàng)建的表中加入兩條記錄:
db2 => insert into accttable values('111-11-1111','Bhogal','Kulvir',1500.00,1000)
db2 => insert into accttable values('222-22-2222','Guy','Someother',2000.00,4000)
觸發(fā)器可以在對(duì)表的一次 INSERT、 DELETE 或者 UPDATE 操作 之前或 之后啟動(dòng)。在我們的例子中,您將創(chuàng)建一個(gè)在對(duì)ACCTTABLE 表執(zhí)行 UPDATE 操作之前啟動(dòng)的觸發(fā)器。在觸發(fā)器術(shù)語(yǔ)中,INSERT、 DELETE 或者 UPDATE 這些使得觸發(fā)器啟動(dòng)的事件被稱作 觸發(fā)事件。觸發(fā)器的啟動(dòng)是在觸發(fā)事件之前還是之后則稱為觸發(fā)器的 激活時(shí)間。
使用 Control Center 創(chuàng)建觸發(fā)器
打開(kāi) DB2 Control Center 開(kāi)始創(chuàng)建觸發(fā)器,展開(kāi)您創(chuàng)建的數(shù)據(jù)庫(kù)(即 bnkdb),鼠標(biāo)右鍵點(diǎn)擊 Triggers 選項(xiàng)并且選擇 Create.....
圖 1. 創(chuàng)建觸發(fā)器
在 Create Trigger 屏幕中,可以指定觸發(fā)器所在的模式。請(qǐng)選擇 DB2ADMIN 模式。記住,觸發(fā)器是與表相關(guān)的,所以我們需要選擇相關(guān)表的模式。然后請(qǐng)?jiān)俅芜x擇 DB2ADMIN 模式:
圖 2. 選擇模式
在同一個(gè)屏幕中, 需要指定一個(gè)觸發(fā)器的名字。將觸發(fā)器命名為 OVERDRAFT。而且,需要指定與該觸發(fā)器相關(guān)的表的名字。這里選擇您創(chuàng)建的 ACCTTABLE。
圖 3. 選擇您創(chuàng)建的表
在 Time to trigger action區(qū)域中,選擇 Before。
圖 4. 選擇 Before
在 Operation that causes the trigger to be executed區(qū)域中選擇 Update of columns 操作并且指定被操作列為 CHECKINGBALANCE:
圖 5.
點(diǎn)擊 Triggered action標(biāo)簽頁(yè)來(lái)創(chuàng)建該觸發(fā)器:
圖 6. 構(gòu)建觸發(fā)器
指定臨時(shí)變量
DB2 UDB 能夠跟蹤在啟動(dòng)觸發(fā)器的那條語(yǔ)句之前和之后的一行的狀態(tài)。請(qǐng)?jiān)?Correlation name for the old rows 一欄中填入 OLDROW, 在 Correlation name for the new rows 一欄中填入 NEWROW :
圖 7. 指定 NEWROW
注意,您也許無(wú)法指定其中的一個(gè) correlation name,因?yàn)樗蕾囉谝鹩|發(fā)器啟動(dòng)的特定操作和激活時(shí)間的組合。例如,假設(shè)您的觸發(fā)器選擇的 Time to trigger action 是 Before,觸發(fā)事件是 DELETE 語(yǔ)句。在這種情況下,我們就無(wú)法指定一個(gè) "Correlation name for the new rows"。為什么呢?因?yàn)樵趫?zhí)行了一個(gè)刪除操作以后,新行是不存在的。
因?yàn)槟鷦?chuàng)建的觸發(fā)器是在 UPDATE 之前被激活,所以不能編輯 Temporary table for the old rows 和 Temporary table for the new rows選項(xiàng)。
您將注意到,在這種情況下(一個(gè)在 UPDATE 之前被激活的觸發(fā)器),您只能指定觸發(fā)器針對(duì) 每 行而不是針對(duì)每個(gè) 語(yǔ)句觸發(fā)。
簡(jiǎn)介
當(dāng)特定事件在 IBM® DB2® Universal Database™ 數(shù)據(jù)庫(kù)中發(fā)生時(shí),您就可以激活 觸發(fā)器來(lái)執(zhí)行其他一些操作。在本文中,您將在觸發(fā)器的世界里遨游,看看如何通過(guò)觸發(fā)器來(lái)增強(qiáng)數(shù)據(jù)庫(kù)中的業(yè)務(wù)規(guī)則。您還將學(xué)習(xí)如何使用 DB2 UDB Version 8.1 的控制中心來(lái)幫助您創(chuàng)建一個(gè)應(yīng)用于簡(jiǎn)單業(yè)務(wù)場(chǎng)景的簡(jiǎn)單觸發(fā)器。
什么是觸發(fā)器
當(dāng)一個(gè)指定的 SQL 操作(如 DELETE,INSERT,或者是 UPDATE 操作)作用于某張表時(shí),一個(gè)定義了一組操作的觸發(fā)器就可以被激活。觸發(fā)器并不像參照完整性約束和檢查約束那樣,我們甚至可以使用對(duì)其他表來(lái)進(jìn)行更新。
業(yè)務(wù)場(chǎng)景
將一項(xiàng)技術(shù)應(yīng)用于真實(shí)世界的一個(gè)場(chǎng)景總是有益的。出于教學(xué)的目的,讓我們?cè)谝粋€(gè)銀行相關(guān)環(huán)境中研究觸發(fā)器,在該模擬環(huán)境中,我們僅僅建立了一張表。再次強(qiáng)調(diào),這是被簡(jiǎn)化了的!我們將要做的是,運(yùn)用觸發(fā)器來(lái)促進(jìn)銀行提供的透支保護(hù)。例如,一個(gè)銀行客戶有一個(gè)支票帳戶(checking account)和一個(gè)儲(chǔ)蓄帳戶(saving account)。當(dāng)從支票帳戶中取款的金額超過(guò)了該帳戶的余額時(shí),就會(huì)發(fā)生一次自動(dòng)的轉(zhuǎn)帳(叫做透支保護(hù)),即自動(dòng)從客戶的儲(chǔ)蓄帳戶轉(zhuǎn)帳過(guò)來(lái)。當(dāng)然,這必須符合一定的條件,即儲(chǔ)蓄帳戶中必須有足夠多的錢來(lái)補(bǔ)償透支的金額。
開(kāi)始
像上面所提及的,我們的銀行僅僅包含一張表。在這張表中,我們將存入客戶的支票帳戶和儲(chǔ)蓄帳戶的余額等信息。每個(gè)客戶通過(guò)其社會(huì)保險(xiǎn)號(hào)碼來(lái)標(biāo)識(shí)。下面是對(duì)該表的描述:
表 1. 對(duì) ACCTTABLE 的描述
Column Name Column Type Nullable? SSN*Varchar(11)NOLastNameVarchar(30)NOFirstNameVarchar(30)NOSavingBalanceDecimal (Precision: 7, Scale: 2)NOCheckingBalanceDecimal (Precision: 7, Scale: 2)NO* 表示主鍵
請(qǐng)使用 DB2 命令行處理器為上面的表創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)。將數(shù)據(jù)庫(kù)命名為 bnkdb。
db2 => create database bnkdb
接下來(lái),連接到該數(shù)據(jù)庫(kù)。我假設(shè)您已經(jīng)在您的機(jī)器上有了一個(gè)用戶名為 db2admin , 密碼為 db2admin 的帳號(hào)。
db2 => connect to bnkdb user db2admin using db2admin
現(xiàn)在,創(chuàng)建 accttable 表:
db2 => create table accttable(ssn varchar(30) not null primary key, lastname varchar(30) not null, firstname varchar(30) not null, savingbalance decimal(7,2) not null, checkingbalance decimal(7,2) not null)
現(xiàn)在向所創(chuàng)建的表中加入兩條記錄:
>
db2 => insert into accttable values('111-11-1111','Bhogal','Kulvir',1500.00,1000)
db2 => insert into accttable values('222-22-2222','Guy','Someother',2000.00,4000)
觸發(fā)器可以在對(duì)表的一次 INSERT、 DELETE 或者 UPDATE 操作 之前或 之后啟動(dòng)。在我們的例子中,您將創(chuàng)建一個(gè)在對(duì)ACCTTABLE 表執(zhí)行 UPDATE 操作之前啟動(dòng)的觸發(fā)器。在觸發(fā)器術(shù)語(yǔ)中,INSERT、 DELETE 或者 UPDATE 這些使得觸發(fā)器啟動(dòng)的事件被稱作 觸發(fā)事件。觸發(fā)器的啟動(dòng)是在觸發(fā)事件之前還是之后則稱為觸發(fā)器的 激活時(shí)間。
使用 Control Center 創(chuàng)建觸發(fā)器
打開(kāi) DB2 Control Center 開(kāi)始創(chuàng)建觸發(fā)器,展開(kāi)您創(chuàng)建的數(shù)據(jù)庫(kù)(即 bnkdb),鼠標(biāo)右鍵點(diǎn)擊 Triggers 選項(xiàng)并且選擇 Create.....
圖 1. 創(chuàng)建觸發(fā)器
在 Create Trigger 屏幕中,可以指定觸發(fā)器所在的模式。請(qǐng)選擇 DB2ADMIN 模式。記住,觸發(fā)器是與表相關(guān)的,所以我們需要選擇相關(guān)表的模式。然后請(qǐng)?jiān)俅芜x擇 DB2ADMIN 模式:
圖 2. 選擇模式
在同一個(gè)屏幕中, 需要指定一個(gè)觸發(fā)器的名字。將觸發(fā)器命名為 OVERDRAFT。而且,需要指定與該觸發(fā)器相關(guān)的表的名字。這里選擇您創(chuàng)建的 ACCTTABLE。
圖 3. 選擇您創(chuàng)建的表
在 Time to trigger action區(qū)域中,選擇 Before。
圖 4. 選擇 Before
在 Operation that causes the trigger to be executed區(qū)域中選擇 Update of columns 操作并且指定被操作列為 CHECKINGBALANCE:
圖 5.
點(diǎn)擊 Triggered action標(biāo)簽頁(yè)來(lái)創(chuàng)建該觸發(fā)器:
圖 6. 構(gòu)建觸發(fā)器
指定臨時(shí)變量
DB2 UDB 能夠跟蹤在啟動(dòng)觸發(fā)器的那條語(yǔ)句之前和之后的一行的狀態(tài)。請(qǐng)?jiān)?Correlation name for the old rows 一欄中填入 OLDROW, 在 Correlation name for the new rows 一欄中填入 NEWROW :
圖 7. 指定 NEWROW
注意,您也許無(wú)法指定其中的一個(gè) correlation name,因?yàn)樗蕾囉谝鹩|發(fā)器啟動(dòng)的特定操作和激活時(shí)間的組合。例如,假設(shè)您的觸發(fā)器選擇的 Time to trigger action 是 Before,觸發(fā)事件是 DELETE 語(yǔ)句。在這種情況下,我們就無(wú)法指定一個(gè) "Correlation name for the new rows"。為什么呢?因?yàn)樵趫?zhí)行了一個(gè)刪除操作以后,新行是不存在的。
因?yàn)槟鷦?chuàng)建的觸發(fā)器是在 UPDATE 之前被激活,所以不能編輯 Temporary table for the old rows 和 Temporary table for the new rows選項(xiàng)。
您將注意到,在這種情況下(一個(gè)在 UPDATE 之前被激活的觸發(fā)器),您只能指定觸發(fā)器針對(duì) 每 行而不是針對(duì)每個(gè) 語(yǔ)句觸發(fā)。
posted on 2007-08-02 11:24
wqwqwqwqwq 閱讀(355)
評(píng)論(0) 編輯 收藏