概要
觸發器是一種數據庫對象,當在表上發生數據修改操作時,觸發器會自動執行業務邏輯。在本次實驗中,我們將使用 Control Center 創建一個觸發器,並將用 DWB 創建一個標量用戶定義函數。
前提條件
首先,確保您的機器上已經安裝了 DB2 Express-C V9.5 免費數據庫服務器;
您已經閱讀了 “DB2Express-C 快速入門”(中文版) 中的相關內容。
您已經學習了本系列實驗的前幾篇文章的相關內容。
創建觸發器(實驗 11)
目標
觸發器是一種數據庫對象,當在表上發生數據修改操作時,觸發器會自動執行業務邏輯。在本次實驗中,將使用 Control Center 創建一個觸發器。這個觸發器為 SALES 表上的修改(UPDATE)維護一個用於審計的日志。我們將在日志中記錄進行修改的用戶的 ID 以及修改時間。
步驟
1.打開“控制中心”。
2.對於本次實驗,需要創建另一個用於日志記錄的表。用以下設置創建一個表:
表名:saleslog
第一列:
名稱:userid
數據類型:VARCHAR(128)
其他屬性:NOT NULL
第二列:
名稱:daytime
數據類型:TIMESTAMP
其他屬性:NOT NULL
提示:在“命令編輯器”中使用 CREATE TABLE 語句創建這個表,也可以在“控制中心”中使用“創建表”向導。
3.在“控制中心”中,展開 EXPRESS 數據庫文件夾。右擊“觸發器” (Triggers)文件夾並選擇“創建”選項。這時會打開“創建觸發器”對話框。
圖 1. 打開“創建觸發器”對話框
圖片看不清楚?請點擊這裡查看原圖(大圖)。
4.在對話框中填寫以下信息:
Trigger Schema(觸發器模式):您用來登錄的用戶 ID(這應該是默認設置)
Trigger Name(觸發器名稱):audit_sales
Table/VIEw Schema(表或視圖模式):您用來登錄的用戶 ID(這應該是默認設置)
Table/VIEw Name(表或視圖名稱):Sales
Time to trigger action(觸發器操作的時間):After (之後)
Operation that causes the trigger to be executed(導致執行觸發器的操作):Update of columns (更新列)(因為我們希望在更新任何列時都觸發這個觸發器,所以不指定任何列)
Comment(注釋):Logs all update actions on Sales table.
圖 2. 設置觸發器選項
圖片看不清楚?請點擊這裡查看原圖(大圖)。
5.在“已觸發操作”選項卡上,選擇“語句”( For Each STATEMENT ) 選項。對於觸發的動作,使用以下代碼:
清單 1. 創建觸發器WHEN ( 1=1 )
BEGIN ATOMIC
INSERT INTO DB2ADMIN.saleslog (userid, daytime) VALUES (CURRENT USER,
CURRENT TIMESTAMP) ;
END
(注意:語句觸發器在激活觸發器的語句執行完之後執行一次。行觸發器指定,每當觸發的 SQL 語句影響到一行時,都執行觸發的動作。)
圖 3. 設置已觸發選項
圖片看不清楚?請點擊這裡查看原圖(大圖)。
單擊“確定”按鈕創建觸發器。
6.現在應該能夠在“控制中心”中的“觸發器”文件夾中看到這個觸發器。
圖 4. 查看創建的觸發器
圖片看不清楚?請點擊這裡查看原圖(大圖)。
7.查詢 saleslog 表,確定其中沒有數據。刪除其中可能存在的任何數據行(DELETE FROM saleslog)。
8.嘗試更新 sales 表中的一個記錄。(提示:使用 Command Editor 或 SQL Assist Wizard。)
9.再次查看 saleslog 表的內容。其中有多少個數據行?
創建用戶定義函數(實驗 12)
目標
DB2 Developer Workbench(DWB)(最新的版本叫做 IBM Data Studio)是一個用來編寫存儲過程和函數的 IDE。在本次實驗中,將用 Data Studio 創建一個標量用戶定義函數。這會幫助您了解 Data Studio 並熟悉編寫用戶定義函數所用的 SQL PL 語言。
前提條件
1.要完成這部分所提到的內容你需要下載並安裝 IBM Data Studio。
2.你需要了解 SQL 和數據庫函數的基本概念。
步驟
1.打開 Data Studio(提示:可以通過 Start 菜單訪問它)。
2.在 Data Project Explorer 窗口中,選擇前面創建的項目並選擇 Open Project。
3.右鍵單擊 User-Defined Functions 文件夾。選擇 New 菜單項。選擇 SQL User-Defined Function 菜單項。如果希望在 GUI 向導的帶領下完成這個過程,也可以選擇 User-Defined Function using Wizard 菜單項。
4.這時應該會打開 Editor 視圖,其中包含一個函數的骨架。將代碼改為:
清單 2. UDF 創建代碼
CREATE FUNCTION booktitle(p_bid INTEGER)
RETURNS VARCHAR(300)
-----------------------------------------------------------------
-- SQL UDF (Scalar)
-----------------------------------------------------------------
SPECIFIC booktitle
F1: BEGIN ATOMIC
DECLARE v_book_title VARCHAR(300);
DECLARE v_err VARCHAR(70);
SET v_book_title = (SELECT title FROM books WHERE p_bid = book_id);
SET v_err = 'Error: The book with ID ' || CHAR(p_bid) || '
was not found.';
IF v_book_title IS NULL THEN
SIGNAL SQLSTATE '80000' SET MESSAGE_TEXT=v_err;
END IF;
RETURN v_book_title;
END
5.右鍵單擊這個函數並選擇 Deploy 構建它。
6.單擊工具欄中的 Run 按鈕運行這個函數。
7.因為這個函數需要一個輸入參數,所以會出現一個對話框,要求您為這個參數指定一個值。
輸入值 80002。
結果是什麼?
再用 1002 試一次。
這一次發生了什麼情況?(提示:查看 Output 視圖的 Messages 部分。)
8.完成後,關閉 DWB。