posts - 97,  comments - 93,  trackbacks - 0

          簡介

          當特定事件在 IBM® DB2® Universal Database™ 數(shù)據(jù)庫中發(fā)生時,您就可以激活 觸發(fā)器來執(zhí)行其他一些操作。在本文中,您將在觸發(fā)器的世界里遨游,看看如何通過觸發(fā)器來增強數(shù)據(jù)庫中的業(yè)務規(guī)則。您還將學習如何使用 DB2 UDB Version 8.1 的控制中心來幫助您創(chuàng)建一個應用于簡單業(yè)務場景的簡單觸發(fā)器。

          什么是觸發(fā)器

          當一個指定的 SQL 操作(如 DELETE,INSERT,或者是 UPDATE 操作)作用于某張表時,一個定義了一組操作的觸發(fā)器就可以被激活。觸發(fā)器并不像參照完整性約束和檢查約束那樣,我們甚至可以使用對其他表來進行更新。

          業(yè)務場景

          將一項技術應用于真實世界的一個場景總是有益的。出于教學的目的,讓我們在一個銀行相關環(huán)境中研究觸發(fā)器,在該模擬環(huán)境中,我們僅僅建立了一張表。再次強調,這是被簡化了的!我們將要做的是,運用觸發(fā)器來促進銀行提供的透支保護。例如,一個銀行客戶有一個支票帳戶(checking account)和一個儲蓄帳戶(saving account)。當從支票帳戶中取款的金額超過了該帳戶的余額時,就會發(fā)生一次自動的轉帳(叫做透支保護),即自動從客戶的儲蓄帳戶轉帳過來。當然,這必須符合一定的條件,即儲蓄帳戶中必須有足夠多的錢來補償透支的金額。

          開始

          像上面所提及的,我們的銀行僅僅包含一張表。在這張表中,我們將存入客戶的支票帳戶和儲蓄帳戶的余額等信息。每個客戶通過其社會保險號碼來標識。下面是對該表的描述:

          表 1. 對 ACCTTABLE 的描述

          Column Name Column Type Nullable? SSN*Varchar(11)NOLastNameVarchar(30)NOFirstNameVarchar(30)NOSavingBalanceDecimal (Precision: 7, Scale: 2)NOCheckingBalanceDecimal (Precision: 7, Scale: 2)NO* 表示主鍵

          請使用 DB2 命令行處理器為上面的表創(chuàng)建一個數(shù)據(jù)庫。將數(shù)據(jù)庫命名為 bnkdb。

          db2 => create database bnkdb

          接下來,連接到該數(shù)據(jù)庫。我假設您已經(jīng)在您的機器上有了一個用戶名為 db2admin , 密碼為 db2admin 的帳號。

          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ā)器可以在對表的一次 INSERT、 DELETE 或者 UPDATE 操作 之前或 之后啟動。在我們的例子中,您將創(chuàng)建一個在對ACCTTABLE 表執(zhí)行 UPDATE 操作之前啟動的觸發(fā)器。在觸發(fā)器術語中,INSERT、 DELETE 或者 UPDATE 這些使得觸發(fā)器啟動的事件被稱作 觸發(fā)事件。觸發(fā)器的啟動是在觸發(fā)事件之前還是之后則稱為觸發(fā)器的 激活時間。

          使用 Control Center 創(chuàng)建觸發(fā)器

          打開 DB2 Control Center 開始創(chuàng)建觸發(fā)器,展開您創(chuàng)建的數(shù)據(jù)庫(即 bnkdb),鼠標右鍵點擊 Triggers 選項并且選擇 Create.....

          圖 1. 創(chuàng)建觸發(fā)器

          在DB2中創(chuàng)建第一個觸發(fā)器(1)(圖一)

          在 Create Trigger 屏幕中,可以指定觸發(fā)器所在的模式。請選擇 DB2ADMIN 模式。記住,觸發(fā)器是與表相關的,所以我們需要選擇相關表的模式。然后請再次選擇 DB2ADMIN 模式:

          圖 2. 選擇模式

          在DB2中創(chuàng)建第一個觸發(fā)器(1)(圖二)

          在同一個屏幕中, 需要指定一個觸發(fā)器的名字。將觸發(fā)器命名為 OVERDRAFT。而且,需要指定與該觸發(fā)器相關的表的名字。這里選擇您創(chuàng)建的 ACCTTABLE。

          圖 3. 選擇您創(chuàng)建的表

          在DB2中創(chuàng)建第一個觸發(fā)器(1)(圖三)

          在 Time to trigger action區(qū)域中,選擇 Before。

          圖 4. 選擇 Before

          在DB2中創(chuàng)建第一個觸發(fā)器(1)(圖四)

          在 Operation that causes the trigger to be executed區(qū)域中選擇 Update of columns 操作并且指定被操作列為 CHECKINGBALANCE:

          圖 5.

          在DB2中創(chuàng)建第一個觸發(fā)器(1)(圖五)

          點擊 Triggered action標簽頁來創(chuàng)建該觸發(fā)器:

          圖 6. 構建觸發(fā)器

          在DB2中創(chuàng)建第一個觸發(fā)器(1)(圖六)

          指定臨時變量

          DB2 UDB 能夠跟蹤在啟動觸發(fā)器的那條語句之前和之后的一行的狀態(tài)。請在 Correlation name for the old rows 一欄中填入 OLDROW, 在 Correlation name for the new rows 一欄中填入 NEWROW :

          圖 7. 指定 NEWROW

          在DB2中創(chuàng)建第一個觸發(fā)器(1)(圖七)

          注意,您也許無法指定其中的一個 correlation name,因為它依賴于引起觸發(fā)器啟動的特定操作和激活時間的組合。例如,假設您的觸發(fā)器選擇的 Time to trigger action 是 Before,觸發(fā)事件是 DELETE 語句。在這種情況下,我們就無法指定一個 "Correlation name for the new rows"。為什么呢?因為在執(zhí)行了一個刪除操作以后,新行是不存在的。

          因為您創(chuàng)建的觸發(fā)器是在 UPDATE 之前被激活,所以不能編輯 Temporary table for the old rows 和 Temporary table for the new rows選項。

          您將注意到,在這種情況下(一個在 UPDATE 之前被激活的觸發(fā)器),您只能指定觸發(fā)器針對 每 行而不是針對每個 語句觸發(fā)。

           

          簡介

          當特定事件在 IBM® DB2® Universal Database™ 數(shù)據(jù)庫中發(fā)生時,您就可以激活 觸發(fā)器來執(zhí)行其他一些操作。在本文中,您將在觸發(fā)器的世界里遨游,看看如何通過觸發(fā)器來增強數(shù)據(jù)庫中的業(yè)務規(guī)則。您還將學習如何使用 DB2 UDB Version 8.1 的控制中心來幫助您創(chuàng)建一個應用于簡單業(yè)務場景的簡單觸發(fā)器。

          什么是觸發(fā)器

          當一個指定的 SQL 操作(如 DELETE,INSERT,或者是 UPDATE 操作)作用于某張表時,一個定義了一組操作的觸發(fā)器就可以被激活。觸發(fā)器并不像參照完整性約束和檢查約束那樣,我們甚至可以使用對其他表來進行更新。

          業(yè)務場景

          將一項技術應用于真實世界的一個場景總是有益的。出于教學的目的,讓我們在一個銀行相關環(huán)境中研究觸發(fā)器,在該模擬環(huán)境中,我們僅僅建立了一張表。再次強調,這是被簡化了的!我們將要做的是,運用觸發(fā)器來促進銀行提供的透支保護。例如,一個銀行客戶有一個支票帳戶(checking account)和一個儲蓄帳戶(saving account)。當從支票帳戶中取款的金額超過了該帳戶的余額時,就會發(fā)生一次自動的轉帳(叫做透支保護),即自動從客戶的儲蓄帳戶轉帳過來。當然,這必須符合一定的條件,即儲蓄帳戶中必須有足夠多的錢來補償透支的金額。

          開始

          像上面所提及的,我們的銀行僅僅包含一張表。在這張表中,我們將存入客戶的支票帳戶和儲蓄帳戶的余額等信息。每個客戶通過其社會保險號碼來標識。下面是對該表的描述:

          表 1. 對 ACCTTABLE 的描述

          Column Name Column Type Nullable? SSN*Varchar(11)NOLastNameVarchar(30)NOFirstNameVarchar(30)NOSavingBalanceDecimal (Precision: 7, Scale: 2)NOCheckingBalanceDecimal (Precision: 7, Scale: 2)NO* 表示主鍵

          請使用 DB2 命令行處理器為上面的表創(chuàng)建一個數(shù)據(jù)庫。將數(shù)據(jù)庫命名為 bnkdb。

          db2 => create database bnkdb

          接下來,連接到該數(shù)據(jù)庫。我假設您已經(jīng)在您的機器上有了一個用戶名為 db2admin , 密碼為 db2admin 的帳號。

          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ā)器可以在對表的一次 INSERT、 DELETE 或者 UPDATE 操作 之前或 之后啟動。在我們的例子中,您將創(chuàng)建一個在對ACCTTABLE 表執(zhí)行 UPDATE 操作之前啟動的觸發(fā)器。在觸發(fā)器術語中,INSERT、 DELETE 或者 UPDATE 這些使得觸發(fā)器啟動的事件被稱作 觸發(fā)事件。觸發(fā)器的啟動是在觸發(fā)事件之前還是之后則稱為觸發(fā)器的 激活時間。

          使用 Control Center 創(chuàng)建觸發(fā)器

          打開 DB2 Control Center 開始創(chuàng)建觸發(fā)器,展開您創(chuàng)建的數(shù)據(jù)庫(即 bnkdb),鼠標右鍵點擊 Triggers 選項并且選擇 Create.....

          圖 1. 創(chuàng)建觸發(fā)器

          在DB2中創(chuàng)建第一個觸發(fā)器(1)(圖一)

          在 Create Trigger 屏幕中,可以指定觸發(fā)器所在的模式。請選擇 DB2ADMIN 模式。記住,觸發(fā)器是與表相關的,所以我們需要選擇相關表的模式。然后請再次選擇 DB2ADMIN 模式:

          圖 2. 選擇模式

          在DB2中創(chuàng)建第一個觸發(fā)器(1)(圖二)

          在同一個屏幕中, 需要指定一個觸發(fā)器的名字。將觸發(fā)器命名為 OVERDRAFT。而且,需要指定與該觸發(fā)器相關的表的名字。這里選擇您創(chuàng)建的 ACCTTABLE。

          圖 3. 選擇您創(chuàng)建的表

          在DB2中創(chuàng)建第一個觸發(fā)器(1)(圖三)

          在 Time to trigger action區(qū)域中,選擇 Before。

          圖 4. 選擇 Before

          在DB2中創(chuàng)建第一個觸發(fā)器(1)(圖四)

          在 Operation that causes the trigger to be executed區(qū)域中選擇 Update of columns 操作并且指定被操作列為 CHECKINGBALANCE:

          圖 5.

          在DB2中創(chuàng)建第一個觸發(fā)器(1)(圖五)

          點擊 Triggered action標簽頁來創(chuàng)建該觸發(fā)器:

          圖 6. 構建觸發(fā)器

          在DB2中創(chuàng)建第一個觸發(fā)器(1)(圖六)

          指定臨時變量

          DB2 UDB 能夠跟蹤在啟動觸發(fā)器的那條語句之前和之后的一行的狀態(tài)。請在 Correlation name for the old rows 一欄中填入 OLDROW, 在 Correlation name for the new rows 一欄中填入 NEWROW :

          圖 7. 指定 NEWROW

          在DB2中創(chuàng)建第一個觸發(fā)器(1)(圖七)

          注意,您也許無法指定其中的一個 correlation name,因為它依賴于引起觸發(fā)器啟動的特定操作和激活時間的組合。例如,假設您的觸發(fā)器選擇的 Time to trigger action 是 Before,觸發(fā)事件是 DELETE 語句。在這種情況下,我們就無法指定一個 "Correlation name for the new rows"。為什么呢?因為在執(zhí)行了一個刪除操作以后,新行是不存在的。

          因為您創(chuàng)建的觸發(fā)器是在 UPDATE 之前被激活,所以不能編輯 Temporary table for the old rows 和 Temporary table for the new rows選項。

          您將注意到,在這種情況下(一個在 UPDATE 之前被激活的觸發(fā)器),您只能指定觸發(fā)器針對 每 行而不是針對每個 語句觸發(fā)。

          posted on 2007-08-02 11:24 wqwqwqwqwq 閱讀(356) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導航:
           
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789




          常用鏈接

          留言簿(10)

          隨筆分類(95)

          隨筆檔案(97)

          文章檔案(10)

          相冊

          J2ME技術網(wǎng)站

          java技術相關

          mess

          搜索

          •  

          最新評論

          閱讀排行榜

          校園夢網(wǎng)網(wǎng)絡電話,中國最優(yōu)秀的網(wǎng)絡電話
          主站蜘蛛池模板: 博乐市| 同心县| 宁安市| 威远县| 南澳县| 青州市| 阜平县| 华亭县| 东丰县| 蒲城县| 喀喇沁旗| 万盛区| 阜康市| 和龙市| 保康县| 南漳县| 旌德县| 武陟县| 铜陵市| 集安市| 化隆| 中卫市| 临颍县| 肃宁县| 大同市| 石棉县| 明水县| 周至县| 牡丹江市| 迁西县| 独山县| 潞城市| 内黄县| 基隆市| 寻乌县| 韩城市| 焉耆| 齐河县| 中江县| 铁岭县| 平和县|