簡介
當特定事件在 IBM® DB2® Universal Database™ 數據庫中發生時,您就可以激活 觸發器來執行其他一些操作。在本文中,您將在觸發器的世界里遨游,看看如何通過觸發器來增強數據庫中的業務規則。您還將學習如何使用 DB2 UDB Version 8.1 的控制中心來幫助您創建一個應用于簡單業務場景的簡單觸發器。
什么是觸發器
當一個指定的 SQL 操作(如 DELETE,INSERT,或者是 UPDATE 操作)作用于某張表時,一個定義了一組操作的觸發器就可以被激活。觸發器并不像參照完整性約束和檢查約束那樣,我們甚至可以使用對其他表來進行更新。
業務場景
將一項技術應用于真實世界的一個場景總是有益的。出于教學的目的,讓我們在一個銀行相關環境中研究觸發器,在該模擬環境中,我們僅僅建立了一張表。再次強調,這是被簡化了的!我們將要做的是,運用觸發器來促進銀行提供的透支保護。例如,一個銀行客戶有一個支票帳戶(checking account)和一個儲蓄帳戶(saving account)。當從支票帳戶中取款的金額超過了該帳戶的余額時,就會發生一次自動的轉帳(叫做透支保護),即自動從客戶的儲蓄帳戶轉帳過來。當然,這必須符合一定的條件,即儲蓄帳戶中必須有足夠多的錢來補償透支的金額。
開始
像上面所提及的,我們的銀行僅僅包含一張表。在這張表中,我們將存入客戶的支票帳戶和儲蓄帳戶的余額等信息。每個客戶通過其社會保險號碼來標識。下面是對該表的描述:
表 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 命令行處理器為上面的表創建一個數據庫。將數據庫命名為 bnkdb。
db2 => create database bnkdb
接下來,連接到該數據庫。我假設您已經在您的機器上有了一個用戶名為 db2admin , 密碼為 db2admin 的帳號。
db2 => connect to bnkdb user db2admin using db2admin
現在,創建 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)
現在向所創建的表中加入兩條記錄:
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)
觸發器可以在對表的一次 INSERT、 DELETE 或者 UPDATE 操作 之前或 之后啟動。在我們的例子中,您將創建一個在對ACCTTABLE 表執行 UPDATE 操作之前啟動的觸發器。在觸發器術語中,INSERT、 DELETE 或者 UPDATE 這些使得觸發器啟動的事件被稱作 觸發事件。觸發器的啟動是在觸發事件之前還是之后則稱為觸發器的 激活時間。
使用 Control Center 創建觸發器
打開 DB2 Control Center 開始創建觸發器,展開您創建的數據庫(即 bnkdb),鼠標右鍵點擊 Triggers 選項并且選擇 Create.....
圖 1. 創建觸發器
在 Create Trigger 屏幕中,可以指定觸發器所在的模式。請選擇 DB2ADMIN 模式。記住,觸發器是與表相關的,所以我們需要選擇相關表的模式。然后請再次選擇 DB2ADMIN 模式:
圖 2. 選擇模式
在同一個屏幕中, 需要指定一個觸發器的名字。將觸發器命名為 OVERDRAFT。而且,需要指定與該觸發器相關的表的名字。這里選擇您創建的 ACCTTABLE。
圖 3. 選擇您創建的表
在 Time to trigger action區域中,選擇 Before。
圖 4. 選擇 Before
在 Operation that causes the trigger to be executed區域中選擇 Update of columns 操作并且指定被操作列為 CHECKINGBALANCE:
圖 5.
點擊 Triggered action標簽頁來創建該觸發器:
圖 6. 構建觸發器
指定臨時變量
DB2 UDB 能夠跟蹤在啟動觸發器的那條語句之前和之后的一行的狀態。請在 Correlation name for the old rows 一欄中填入 OLDROW, 在 Correlation name for the new rows 一欄中填入 NEWROW :
圖 7. 指定 NEWROW
注意,您也許無法指定其中的一個 correlation name,因為它依賴于引起觸發器啟動的特定操作和激活時間的組合。例如,假設您的觸發器選擇的 Time to trigger action 是 Before,觸發事件是 DELETE 語句。在這種情況下,我們就無法指定一個 "Correlation name for the new rows"。為什么呢?因為在執行了一個刪除操作以后,新行是不存在的。
因為您創建的觸發器是在 UPDATE 之前被激活,所以不能編輯 Temporary table for the old rows 和 Temporary table for the new rows選項。
您將注意到,在這種情況下(一個在 UPDATE 之前被激活的觸發器),您只能指定觸發器針對 每 行而不是針對每個 語句觸發。
簡介
當特定事件在 IBM® DB2® Universal Database™ 數據庫中發生時,您就可以激活 觸發器來執行其他一些操作。在本文中,您將在觸發器的世界里遨游,看看如何通過觸發器來增強數據庫中的業務規則。您還將學習如何使用 DB2 UDB Version 8.1 的控制中心來幫助您創建一個應用于簡單業務場景的簡單觸發器。
什么是觸發器
當一個指定的 SQL 操作(如 DELETE,INSERT,或者是 UPDATE 操作)作用于某張表時,一個定義了一組操作的觸發器就可以被激活。觸發器并不像參照完整性約束和檢查約束那樣,我們甚至可以使用對其他表來進行更新。
業務場景
將一項技術應用于真實世界的一個場景總是有益的。出于教學的目的,讓我們在一個銀行相關環境中研究觸發器,在該模擬環境中,我們僅僅建立了一張表。再次強調,這是被簡化了的!我們將要做的是,運用觸發器來促進銀行提供的透支保護。例如,一個銀行客戶有一個支票帳戶(checking account)和一個儲蓄帳戶(saving account)。當從支票帳戶中取款的金額超過了該帳戶的余額時,就會發生一次自動的轉帳(叫做透支保護),即自動從客戶的儲蓄帳戶轉帳過來。當然,這必須符合一定的條件,即儲蓄帳戶中必須有足夠多的錢來補償透支的金額。
開始
像上面所提及的,我們的銀行僅僅包含一張表。在這張表中,我們將存入客戶的支票帳戶和儲蓄帳戶的余額等信息。每個客戶通過其社會保險號碼來標識。下面是對該表的描述:
表 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 命令行處理器為上面的表創建一個數據庫。將數據庫命名為 bnkdb。
db2 => create database bnkdb
接下來,連接到該數據庫。我假設您已經在您的機器上有了一個用戶名為 db2admin , 密碼為 db2admin 的帳號。
db2 => connect to bnkdb user db2admin using db2admin
現在,創建 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)
現在向所創建的表中加入兩條記錄:
>
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)
觸發器可以在對表的一次 INSERT、 DELETE 或者 UPDATE 操作 之前或 之后啟動。在我們的例子中,您將創建一個在對ACCTTABLE 表執行 UPDATE 操作之前啟動的觸發器。在觸發器術語中,INSERT、 DELETE 或者 UPDATE 這些使得觸發器啟動的事件被稱作 觸發事件。觸發器的啟動是在觸發事件之前還是之后則稱為觸發器的 激活時間。
使用 Control Center 創建觸發器
打開 DB2 Control Center 開始創建觸發器,展開您創建的數據庫(即 bnkdb),鼠標右鍵點擊 Triggers 選項并且選擇 Create.....
圖 1. 創建觸發器
在 Create Trigger 屏幕中,可以指定觸發器所在的模式。請選擇 DB2ADMIN 模式。記住,觸發器是與表相關的,所以我們需要選擇相關表的模式。然后請再次選擇 DB2ADMIN 模式:
圖 2. 選擇模式
在同一個屏幕中, 需要指定一個觸發器的名字。將觸發器命名為 OVERDRAFT。而且,需要指定與該觸發器相關的表的名字。這里選擇您創建的 ACCTTABLE。
圖 3. 選擇您創建的表
在 Time to trigger action區域中,選擇 Before。
圖 4. 選擇 Before
在 Operation that causes the trigger to be executed區域中選擇 Update of columns 操作并且指定被操作列為 CHECKINGBALANCE:
圖 5.
點擊 Triggered action標簽頁來創建該觸發器:
圖 6. 構建觸發器
指定臨時變量
DB2 UDB 能夠跟蹤在啟動觸發器的那條語句之前和之后的一行的狀態。請在 Correlation name for the old rows 一欄中填入 OLDROW, 在 Correlation name for the new rows 一欄中填入 NEWROW :
圖 7. 指定 NEWROW
注意,您也許無法指定其中的一個 correlation name,因為它依賴于引起觸發器啟動的特定操作和激活時間的組合。例如,假設您的觸發器選擇的 Time to trigger action 是 Before,觸發事件是 DELETE 語句。在這種情況下,我們就無法指定一個 "Correlation name for the new rows"。為什么呢?因為在執行了一個刪除操作以后,新行是不存在的。
因為您創建的觸發器是在 UPDATE 之前被激活,所以不能編輯 Temporary table for the old rows 和 Temporary table for the new rows選項。
您將注意到,在這種情況下(一個在 UPDATE 之前被激活的觸發器),您只能指定觸發器針對 每 行而不是針對每個 語句觸發。
posted on 2007-08-02 11:24
wqwqwqwqwq 閱讀(355)
評論(0) 編輯 收藏