200 likes | 482 Vues
資料庫系統概論 CH11 觸發程序及自訂函數. 鄧姚文. 大綱. 另一種預存程序 -Trigger DML 觸發程序 DDL 觸發程序 自訂函數 -Function. 觸發程序的種類. 分為 DML 及 DDL 若未特別說明,一般觸發程序是指 DML DML 觸發程序 為 INSERT 、 UPDATE 、 DELETE 設計的事件 處理常式 DDL 觸發程序 為 CREATE 、 DROP 、 ALTER 設計的事件 處理常式. DML 觸發程序. AFTER Trigger
E N D
大綱 另一種預存程序-Trigger DML觸發程序 DDL觸發程序 自訂函數-Function
觸發程序的種類 • 分為DML及DDL • 若未特別說明,一般觸發程序是指DML • DML觸發程序 • 為 INSERT、UPDATE 、DELETE 設計的事件處理常式 • DDL觸發程序 • 為 CREATE、DROP、ALTER 設計的事件處理常式
DML 觸發程序 • AFTER Trigger • 在執行 INSERT、UPDATE、DELETE 之後觸發 • INSTEAD OF Trigger • 在執行 INSERT、UPDATE、DELETE 之前觸發 • 特殊資料表: • INSERTED 新增的資料 • DELETED 刪出的資料 • UPDATE 相當於先 DELETE 再 INSERT
停用觸發程序 • 觸發程序一經建立,就已啟用 • 停用: ALTER TABLE CustomerSupplier disable TRIGGER chkCustomerName 或 DISABLE TRIGGER chkCustomerName ON CustomerSupplier
INSTEAD OF Trigger 可定義在使用多個資料表的檢視(VIEW) 可以取消部份或全部動作 可以取代原有的動作
INSTEAD OF Trigger • 儲存前檢查-程式11-2 • 以Instead of Update取代Update • 在檢視使用觸發程序-程式11-3 • 先判斷輸入新記錄的CustSupCode欄位值是否已儲存在於CustomerSupplier資料表,若不存在則新增;再判斷新記錄的OrderCode欄位是否已在Orders資料表中,若不存在則新增
取得更改及刪除的資料 • 經常使用的兩個特殊資料表 • 取得新增及更改的資料 SELECT * FROM INSERTED • 取得刪除的資料 SELECT * FROM DELETED
相關可用函數 • Columns_Updated-以欄位順序判斷某欄位是否已更新 If Columns_Updated() & 2 = 2 … If Columns_Updated() & 3 = 3 … • Update-以欄名判斷某欄位是否已更新 If Updated(Totals) or Update(OrderDate) …
建立DDL觸發程序 • 建立DDL觸發程序 • 設計重點是ON及FOR子句 • ON表示有效範圍-可以是ALL SERVER或DATABASE • FOR之後是DDL觸發程序的事件 • 刪除資料表時復原 CREATE TRIGGER NotDropTableOnDaShang ON DATABASE FOR DROP_TABLE AS RaisError(‘不可刪除資料表’, 16, 1) ROLLBACK
使用EVENTDATA函數 • 只可使用於DDL觸發程序 • 提供啟動觸發程序的相關資訊 • 傳回內容是xml型態 • 以value方法查詢CommandText,取得執行的T-SQL
自訂函數 FUNCTION • User-defined Function(UDF) • 運算之後,傳回一項資料 • 一個資料表 • 一個純量值(Scalar) • 參數只能傳入,不能傳出 • 不可以使用 OUTPUT 參數 • 可以放在運算式之中 • 可以在 SELECT 敘述之中使用 UDF
函數的特性 • 內建及自訂函數必定有唯一的名稱,再加上傳入的參數、傳回值及主體 • 函數屬性可以定義函數的作業方式,但這些屬性都是由系統決定,在T-SQL中可以OBJECTPROPERTY取得 • IsDeterministic:函數可分為決定性(True)及非決定性(False) • IsPrecise:函數可分為精確(True)及不精確(False) • IsSystemVerified:系統可否驗證函數的有效位數及決定性屬性 • SystemDataAccess:函數可否存取伺服器的系統資料 • UserDataAccess:函數可否存取使用者資料
函數與預存程序 • 相同 • 副程式:依照傳入參數執行預定的運算 • 差異 • 預存程序必須以 EXEC 指令執行,函數可以在敘述之中使用 • 函數只能傳回一個值,預存程序可以使用多個傳出參數 • 函數通常只運算不更新,預存程序通常以交易更新多個資料表
建立自訂函數 • 使用Create Function • 純量函數-IIF-程式11-7 • 純量函數-getYMDays-程式11-8 • 資料表值函數-ProductStockCount -程式11-9 • 內嵌函數-ProductStockCountIn -程式11-10