16 觸發程序 16-1 觸發程序的基礎 16-2 DML觸發程序 16-3 修改、停用與刪除DML觸發程序 16-4 DDL觸發程序.

Slides:



Advertisements
Similar presentations
第二章 简单的 SQL 语句. 本章要点  创建一个简单的表  SQL 语句介绍  最简单的查询语句 select  带有限制条件的查询  查询结果的排序显示.
Advertisements

2010 年 6 月课件制作人:王亚楠 1 模块 2 项目开发概论 教学课件 年 6 月课件制作人:王亚楠 2 目录 目标 了解:数据库技术的基本概念与结构 理解:数据模型的分类与结构组成 掌握:关系数据库及 SQL 的基本理论 知识 掌握:数据库设计的方法与步骤 内容 2.1 数据库技术基础.
第 7 章 数据库 1. Overview  数据库概述  数据库管理系统  数据库的体系结构和数据库模型  SQL 语言  数据库技术  构建数据库系统 2.
教学网站: 数据库及应用 授课教师:岳静 Tel: 教学网站:
第5章 关系数据库标准语言SQL 主讲:张丽芳.
十一 ASP对数据库的访问.
第2讲 Transact-SQL语言.
第5章 索引及视图操作 数据库原理应用与实践 SQL SERver2014(第2版) 主编 贾铁军 科学出版社 编著 陈国秦 万程 邢一鸣
第14章 預存程序 14-1 預存程序的基礎 14-2 建立與執行預存程序 14-3 預存程序的參數傳遞 14-4 預存程序的傳回值
資料庫 (Database) SQL Server 2008實作
数据库概述 简而言之,数据库(DataBase)就是一个存储数据的仓库。为了方便数据的存储和管理,它将数据按照特定的规律存储在磁盘上。通过数据库管理系统,可以有效的组织和管理存储在数据库中的数据。如今,已经存在了Oracle、SQL Server、MySQL等诸多优秀的数据库。在这一章中将讲解的内容包括。
Chap 13 視界與資料庫程式設計.
计算机应用基础 上海大学计算中心.
Views ,Stored Procedures, User-defined Function, Triggers
数据库应用与程序设计.
第五讲 利用视图进行查询优化.
SQL Structured Query Language 用以操縱資料庫的指令集 資料操作語言DML:操作資料錄
9 SELECT敘述的進階查詢 9-1 SQL的多資料表查詢 9-2 合併查詢 9-3 集合運算查詢 9-4 子查詢
程式設計概論 1.1 程式設計概論 程式語言的演進 物件導向程式 程式開發流程 1.2 C++開發工具
14 預存程序與順序物件 14-1 預存程序的基礎 14-2 建立與執行預存程序 14-3 預存程序的參數傳遞 14-4 預存程序的傳回值
LINQ 建國科技大學 資管系 饒瑞佶.
課程名稱:資料庫系統 授課老師:李春雄 博士
後端教學-MYSQL 講師:邱小楓(邱珈蓉)
9/28號專題報告 Web網頁遊戲 曾建瑋.
連結資料庫 ACCESS MSSQL.
Chap 10 SQL定義、操作與控制指令.
第 11 章 建立檢視表.
高等資料庫管理系統 Advanced Database Management System
第八章 利用SELECT查詢資料.
資料庫管理 操作DBMS 指導教授:楊維邦  助教:廖皓翔.
SQL語法 定義與操作指令.
第 16 章 觸發程序.
SQL Server 2000 数据库入门.
第7章 ADO.NET操作SQL Server数据库
第10章 SQL定義、操作與控制指令 10-1 SQL語言的基礎 10-2 SQL查詢工具 10-3 資料庫的實體資料模型
5 数据库管理与保护 数据库运行的最小逻辑工作单位是事务,所有对数据库的操作,都以事务作为一个整体来执行或撤销。
SQL Stored Procedure SQL 預存程序.
第七章: 建立資料表.
SQL語法.
第十七章 資料庫SQL 17-1 SELECT 17-2 INSERT 17-3 UPDATE 17-4 DELETE.
Ch12 MySQL資料庫管理 網頁程式設計.
App Inventor2呼叫PHP存取MySQL
資料庫程式設計 VB資料庫設計簡介 週次:6 建國科技大學 資管系 饒瑞佶.
Ch4.SQL Server 2005資料庫組成員元件介紹
数据库应用技术 SQL Server 2005.
数据库技术与应用.
ORACLE 第九讲 触发器.
20 SQL Server全文檢索搜尋 20-1 SQL Server全文檢索搜尋 20-2 全文檢索目錄的建立 20-3 建立全文檢索索引
第11章 事务与锁 11.1 事务Transact 11.2 数据并发的问题 11.3 锁Lock 11.4 事务隔离级别.
FILESTREAM、FileTable、JSON與R語言
4.2 视图 (1) 视图是一个虚拟表,其内容来自对表查询的基础上。
3.2 Mysql 命令行 1 查看数据库 SHOW DATABASES; 2 创建一个数据库test1 CREATE DATABASE test1; 3 选择你所创建的数据库 USE test1; (按回车键出现Database changed 时说明操作成功!) 4 查看现在的数据库中存在什么表.
PHP與MySQL 入門學習指南 凱文瑞克 著 第 22 章 SQL 介紹與建立MySQL資料庫.
SQL查询语句 蔡海洋.
17 交易處理與鎖定 17-1 交易的基礎 17-2 交易處理 17-3 並行控制 17-4 資料鎖定 17-5 死結問題.
第 8 章 資料的新增、修改 與刪除.
第三章 SQL Server数据管理.
GridView.
GridView操作 (II).
流程控制:Switch-Case 94學年度第一學期‧資訊教育 東海大學物理系.
SQL語法教學 2015/10/15 John.
第 4 章 認識 SQL 語言與資料型別.
商品交易資料庫 顧客上網買商品 如何紀錄客戶資料? 如何紀錄商品資料? 如何紀錄交易資料? 如何處理交易後的所有『後處理』程序?
11 檢視表的建立 11-1 檢視表的基礎 11-2 建立檢視表 11-3 修改與刪除檢視表 11-4 編輯檢視表的內容.
資料結構與C++程式設計進階 期末考 講師:林業峻 CSIE, NTU 7/ 15, 2010.
Cloud Training Material- 事件 Sherman Wang
第4章 数据查询.
SQLite資料庫 靜宜大學資管系 楊子青.
Unix指令4-文字編輯與程式撰寫.
Joining Multiple Tables
Presentation transcript:

16 觸發程序 16-1 觸發程序的基礎 16-2 DML觸發程序 16-3 修改、停用與刪除DML觸發程序 16-4 DDL觸發程序

16-1 觸發程序的基礎-說明 觸發程序(Triggers)是一種特殊用途的預存程序,我們並不能單獨執行觸發程序,因為它是在執行T-SQL語言的DDL指令或DML指令產生事件時,系統主動執行的程序。 觸發程序也是一組T-SQL指令敘述的集合(但沒有參數,也不能傳回值),觸發程序可以執行一些自動化操作,例如:自動更改或刪除相關聯的記錄資料、加強欄位的商業規則驗證、比較資料更改前後的資料表狀態和建立不同資料庫的參考完整性。

16-1 觸發程序的基礎-種類 SQL Server觸發程序可以分為兩種,其說明如下所示: DML觸發程序(DML Triggers):當執行資料表操作指令INSERT、UPDATE和DELETE時,所自動執行的觸發程序,可以用來驗證商業規則,或執行更複雜的資料驗證程序。 DDL觸發程序(DDL Triggers):一種特殊類型的觸發程序,它可以回應DDL指令(主要是指CREATE、ALTER和DROP開頭的指令)來執行資料庫的管理工作,例如:稽核與管理資料庫作業。

16-1 觸發程序的基礎-用途1 觸發程序可以驗證商業規則,或執行更複雜的資料驗證程序,例如:檢查使用者是否調整圖書價格超過百分之五、庫存是否足夠和客戶是否擁有足夠的採購額度等。 觸發程序可以用來維持多資料表間的資料完整性,我們可以透過觸發程序來更改相關聯的記錄資料。例如:在【訂單】資料表刪除一筆記錄後,使用觸發程序在【訂單明細】資料表刪除此訂單相關的所有項目資料;或是出貨一項商品,就自動將庫存量減一。

16-1 觸發程序的基礎-用途2 觸發程序能夠檢查資料更改是否是允許的操作,如果不允許就回復資料更改,我們也可以使用觸發程序直接更改或取消原來的資料操作,並且使用電子郵件發出預警的通知郵件。 觸發程序可以分析操作來執行其他的後續處理,因為觸發程序可以比較資料更改前後的資料表狀態,換句話說,我們就可以針對比較結果來執行進一步的處理。 觸發程序可以取代系統預設產生的錯誤訊息,讓我們建立自訂錯誤訊息來回應用戶端程式。

16-2 DML觸發程序 16-2-1 建立DML觸發程序 16-2-2 DML觸發程序與條件約束 16-2-3 建立AFTER觸發程序 16-2-4 建立INSTEAD OF觸發程序 16-2-5 使用UPDATE()函數

16-2 DML觸發程序-說明 DML觸發程序是當執行INSERT、UPDATE和DELETE資料表操作指令時,一種自動執行的觸發程序,可以讓我們建立強制執行的商業規則、擴充條件約束、預設值和規則等維持資料完整性的條件。

16-2 DML觸發程序-種類 SQL Server的DML觸發程序依觸發時機可以分為兩種,如下所示: AFTER觸發程序:當執行INSERT、UPDATE和DELETE指令且資料已經改變後,所觸發和執行的觸發程序,主要是用來執行一些檢查或善後處理,如果有錯誤,更改的資料可以回復至更改前的值。 INSTEAD OF觸發程序:這是在資料改變前所觸發和執行的觸發程序,可以驗證資料或取代原本需要執行的操作。

16-2-1 建立DML觸發程序- 使用Management Studio 如同預存程序,我們一樣可以使用Management Studio工具的指令或直接新增查詢來建立DML觸發程序,如下圖所示:

16-2-1 建立DML觸發程序- 使用T-SQL指令(語法) 在T-SQL語言是使用CREATE TRIGGER指令建立觸發程序,其基本語法如下所示: CREATE TRIGGER 觸發程序名稱 ON { 資料表名稱 | 檢視表名稱 } [ WITH ENCRYPTION ] { FOR | AFTER | INSTEAD OF } { [ INSERT ] [,] [ UPDATE ] [,] [DELETE] } AS T-SQL指令敘述

16-2-1 建立DML觸發程序-使用T-SQL指令(Deleted與Inserted資料表) 在DML觸發程序可以查詢系統自動產生的Deleted與Inserted邏輯資料表(Logical Tables),這兩個資料表能夠保留更改前後的記錄資料,其欄位資料完全對應ON子句資料表的欄位定義,我們一樣是使用SELECT指令來查詢Deleted與Inserted資料表,如下所示: SELECT * FROM Inserted SELECT * FROM Deleted

16-2-1 建立DML觸發程序- 使用T-SQL指令(範例1) SQL指令碼檔:Ch16_2_1_01.sql 在【教務系統】資料庫的【課程】資料表建立名為【新增記錄】的DML觸發程序,它是對應INSERT指令的事件,如下所示: CREATE TRIGGER 新增記錄 ON 課程 FOR INSERT AS BEGIN DECLARE @name varchar(30) SELECT @name = 名稱 FROM Inserted PRINT '新增課程: ' + @name END

16-2-1 建立DML觸發程序- 使用T-SQL指令(範例2) SQL指令碼檔:Ch16_2_1_02.sql 在【課程】資料表新增一筆記錄時,就會觸發執行【新增記錄】觸發程序,顯示新增記錄的課程名稱,如下所示: INSERT INTO 課程 VALUES ('CS301','作業系統概論',4)

16-2-2 DML觸發程序與條件約束-1 AFTER觸發程序與條件約束 AFTER觸發程序的執行流程是當使用者執行INSERT、UPDATE和DELETE的DML操作指令後,依序檢查條件約束、建立Deleted與Inserted資料表,並且在實際更新資料表的記錄資料後才執行AFTER觸發程序,如果操作有違反資料表的條件約束,並不會執行到AFTER觸發程序。 在AFTER觸發程序並沒有辦法事先作一些處理,來避免違反資料表的條件約束,只能增加額外的欄位檢查條件和處理來進一步維護資料完整性。例如:客戶需要擁有足夠的採購額度,才允許此客戶下訂單採購。

16-2-2 DML觸發程序與條件約束-2 INSTEAD OF觸發程序與條件約束 INSTEAD OF觸發程序是在Deleted與Inserted資料表建立後就執行,即在其他操作之前(包含條件約束)。換句話說,INSTEAD OF觸發程序是在執行條件約束前執行,我們可以在INSTEAD OF觸發程序預先處理來避免違反資料表的條件約束。 INSTEAD OF觸發程序主要是用來攔截和取代指定的操作,我們需要在INSTEAD OF觸發程序自行撰寫指令來更改或取消原來的資料操作,不過,在INSTEAD OF觸發程序執行的操作還是需要經過條件約束的檢查。

16-2-3 建立AFTER觸發程序-說明 在SQL Server資料表可以建立多個AFTER觸發程序,但只能有一個INSTEAD OF觸發程序,而且,AFTER觸發程序並不能使用在檢視表,只有INSTEAD OF觸發程序可以使用在檢視表。 AFTER和INSTEAD OF觸發程序依執行的指令不同,可以再分為:INSERT觸發程序、UPDATE觸發程序和DELETE觸發程序三種。

16-2-3 建立AFTER觸發程序- AFTER INSERT觸發程序(說明) AFTER的INSERT觸發程序是當使用者在資料表插入一筆記錄時觸發,因為是新增記錄,所以新增的記錄同時也會新增至Inserted資料表,並不會用到Deleted資料表。

16-2-3 建立AFTER觸發程序- AFTER INSERT觸發程序(範例1) SQL指令碼檔:Ch16_2_3_01.sql 針對INSERT指令建立【檢查上課數】的AFTER觸發程序,限制每一位學生最多只能上三門課程,如下所示: CREATE TRIGGER 檢查上課數 ON 班級 AFTER INSERT AS BEGIN IF ( SELECT COUNT(學號) FROM 班級 WHERE 學號 = ( SELECT 學號 FROM Inserted) ) > 3 RAISERROR('已經修太多課程!',1,1) ROLLBACK END

16-2-3 建立AFTER觸發程序- AFTER INSERT觸發程序(範例2) SQL指令碼檔:Ch16_2_3_02.sql 在【班級】資料表新增記錄就會觸發執行【檢查上課數】觸發程序,如果學生的上課數太多,就會顯示錯誤訊息且回復資料不允許新增此記錄,如下所示: INSERT INTO 班級 VALUES ('I004', 'S001', 'CS111','03:00:00', '321-M')

16-2-3 建立AFTER觸發程序- AFTER UPDATE觸發程序(說明) AFTER的UPDATE觸發程序當使用者在資料表更新記錄時觸發,因為是更新記錄,更新資料是新增至Inserted資料表,原始資料是新增至Deleted資料表。

16-2-3 建立AFTER觸發程序- AFTER UPDATE觸發程序(範例1) SQL指令碼檔:Ch16_2_3_03.sql 在【課程】資料表建立名為【檢查學分數】的觸發程序,限制更新的學分數只能增加,不能減少,如下所示: CREATE TRIGGER 檢查學分數 ON 課程 AFTER UPDATE AS BEGIN DECLARE @new int, @old int SELECT @new = 學分 FROM Inserted SELECT @old = 學分 FROM Deleted IF @old > @new PRINT '不允許更新學分欄位!' ROLLBACK TRAN END

16-2-3 建立AFTER觸發程序- AFTER UPDATE觸發程序(範例2) SQL指令碼檔:Ch16_2_3_04.sql 在【課程】資料表更新記錄時就會觸發執行【檢查學分數】觸發程序,檢查更改的學分數是否是增加,如下所示: UPDATE 課程 SET 學分 = 3 WHERE 課程編號 = 'CS301'

16-2-3 建立AFTER觸發程序- AFTER DELETE觸發程序(說明) AFTER的DELETE觸發程序是當使用者在資料表刪除一筆記錄時觸發,因為是刪除記錄,所以刪除的記錄同時也會新增至Deleted資料表,並不會用到Inserted資料表。

16-2-3 建立AFTER觸發程序- AFTER DELETE觸發程序(範例1) SQL指令碼檔:Ch16_2_3_05.sql 在【教務系統】資料庫的【員工】資料表,同時針對DELETE和UPDATE指令建立名為【員工管理】的AFTER觸發程序,可以檢查刪除或更改的姓名是否存在【學生】資料表,如果存在,就拒絕刪除與更新,如下所示: CREATE TRIGGER 員工管理 ON 員工 AFTER DELETE, UPDATE AS IF EXISTS (SELECT * FROM 學生 WHERE 姓名 = (SELECT 姓名 FROM Deleted)) BEGIN RAISERROR('不合法姓名!',1,1) ROLLBACK TRAN END

16-2-3 建立AFTER觸發程序- AFTER DELETE觸發程序(範例2) SQL指令碼檔:Ch16_2_3_06.sql 在【員工】資料表刪除記錄時就會觸發【員工管理】觸發程序,如果員工姓名存在【學生】資料表,就顯示錯誤訊息,並且回復資料不允許刪除這筆記錄,如下所示: DELETE 員工 WHERE 身份證字號 = 'F332213046'

16-2-3 建立AFTER觸發程序- AFTER DELETE觸發程序(範例3) SQL指令碼檔:Ch16_2_3_07.sql 在【員工】資料表更新記錄就會觸發執行【員工管理】的觸發程序,如果更新的員工姓名存在【學生】資料表,就顯示錯誤訊息,和回復資料不允許更新記錄,如下所示: UPDATE 員工 SET 薪水 = 55000 WHERE 身份證字號 = 'F332213046'

16-2-4 建立INSTEAD OF觸發程序-說明 INSTEAD OF觸發程序可以攔截和取代指定操作,因為觸發的操作指令並不會執行,所以在INSTEAD OF觸發程序就需要執行這些操作。 不同於AFTER觸發程序,INSTEAD OF觸發程序可以使用在檢視表,讓檢視表成為可編輯的檢視表。不過,INSTEAD OF觸發程序並不支援遞迴呼叫,而且在同一個資料表或檢視表只能擁有一個INSTEAD OF觸發程序。

16-2-4 建立INSTEAD OF觸發程序- 建立(說明) INSTEAD OF觸發程序一樣分為INSERT、UPDATE和DELETE三種,因其架構和AFTER觸發程序類似,所以筆者只準備使用INSERT事件來說明如何在資料表建立INSTEAD OF觸發程序。

16-2-4 建立INSTEAD OF觸發程序- 建立(範例1a) SQL指令碼檔:Ch16_2_4_01.sql 在【教務系統】資料庫的【課程】資料表,針對INSERT指令建立名為【新增課程記錄】的INSTEAD OF觸發程序,如果新增記錄的課程編號存在,就改為更新課程記錄,如下所示: CREATE TRIGGER 新增課程記錄 ON 課程 INSTEAD OF INSERT AS BEGIN IF EXISTS (SELECT * FROM 課程 WHERE 課程編號 = ( SELECT 課程編號 FROM Inserted)) UPDATE 課程 SET 課程.名稱 = Inserted.名稱,

16-2-4 建立INSTEAD OF觸發程序- 建立(範例1b) 課程.學分 = Inserted.學分 FROM 課程 JOIN Inserted ON 課程.課程編號 = Inserted.課程編號 PRINT '更新一筆記錄!' END ELSE BEGIN INSERT 課程 SELECT * FROM Inserted PRINT '新增一筆記錄!'

16-2-4 建立INSTEAD OF觸發程序- 建立(範例2) SQL指令碼檔:Ch16_2_4_02.sql 在【課程】資料表新增記錄就會觸發INSTEAD OF觸發程序【新增課程記錄】,以此例是存在的課程編號,如下所示: INSERT INTO 課程 VALUES ('CS213', '物件導向程式設計', 4)

16-2-4 建立INSTEAD OF觸發程序- 建立(範例3) SQL指令碼檔:Ch16_2_4_03.sql 在【課程】資料表新增記錄就會觸發INSTEAD OF觸發程序【新增課程記錄】,以此例是新的課程編號,如下所示: INSERT INTO 課程 VALUES ('CS333', '物件導向程式設計(2)', 3)

16-2-4 建立INSTEAD OF觸發程序- 在檢視表建立(說明) INSTEAD OF觸發程序也可以使用在檢視表(AFTER觸發程序不能使用在檢視表),可以讓原來不可編輯的檢視表成為可編輯的檢視表。如果是合併查詢的檢視表,就可以同時插入、更新或刪除多個資料表的記錄資料。 例如:建立同時是學生和員工的【學生員工_檢視】檢視表後,就可以新增此檢視表的INSTEAD OF觸發程序,當在檢視表新增記錄,即可同時在【學生】和【員工】資料表各新增一筆記錄。

16-2-4 建立INSTEAD OF觸發程序- 在檢視表建立(範例1) SQL指令碼檔:Ch16_2_4_04.sql 建立【學生】與【員工】資料表的合併查詢檢視表【學生員工_檢視】,可以同時顯示是學生和員工的記錄資料,如下所示: CREATE VIEW 學生員工_檢視 AS SELECT 學生.學號,學生.姓名,學生.性別, 學生.電話,學生.生日, 員工.身份證字號,員工.城市, 員工.街道, 員工.薪水,員工.保險,員工.扣稅 FROM 學生 INNER JOIN 員工 ON 學生.姓名 = 員工.姓名 GO SELECT * FROM 學生員工_檢視

16-2-4 建立INSTEAD OF觸發程序- 在檢視表建立(範例2a) SQL指令碼檔:Ch16_2_4_05.sql 在【教務系統】資料庫的【學生員工_檢視】檢視表,針對INSERT指令建立名為【新增學生員工記錄】的INSTEAD OF觸發程序,可以同時新增【員工】和【學生】資料表的記錄資料,如下所示: CREATE TRIGGER 新增學生員工記錄 ON 學生員工_檢視 INSTEAD OF INSERT AS DECLARE @rowCount int SELECt @rowCount = COUNT(*) FROM Inserted IF @rowCount = 1 BEGIN INSERT 學生

16-2-4 建立INSTEAD OF觸發程序- 在檢視表建立(範例2b) SELECT 學號, 姓名, 性別, 電話, 生日 FROM Inserted INSERT 員工 SELECT 身份證字號, 姓名, 城市, 街道, 電話, 薪水, 保險, 扣稅 PRINT '新增兩筆記錄!' END ELSE RAISERROR('錯誤: 只允許能新增一筆記錄.',1,1)

16-2-4 建立INSTEAD OF觸發程序- 在檢視表建立(範例3) SQL指令碼檔:Ch16_2_4_06.sql 在【學生員工_檢視】檢視表新增記錄就會觸發INSTEAD OF觸發程序【新增學生員工記錄】,可以同時新增【員工】和【學生】資料表的記錄資料,如下所示: INSERT INTO 學生員工_檢視 VALUES ('S500', '陳允傑', '男','05-55522222','1995/12/25' 'F123450789','台北','仁愛路', 50000, 2000, 900)

16-2-5 使用UPDATE()函數-語法 UPDATE()函數可以檢查指定欄位是否有更新,它是建立觸發程序時,一個非常好用的函數,其基本語法如下所示: IF UPDATE(欄位名稱1) [AND | OR UPDATE(欄位名稱2)] 上述語法的IF指令使用UPDATE()函數檢查參數的欄位是否有更新,如果有,傳回True,否則為False。

16-2-5 使用UPDATE()函數-範例1a SQL指令碼檔:Ch16_2_5_01.sql CREATE TRIGGER 更新檢查 ON 教授 AFTER UPDATE AS DECLARE @count int SET @count = 0 IF UPDATE(職稱) BEGIN PRINT '更新職稱欄位!' SET @count = @count + 1

16-2-5 使用UPDATE()函數-範例1b END IF UPDATE(科系) BEGIN PRINT '更新科系欄位!' SET @count = @count + 1 IF @count > 0 PRINT '更新 [' + CONVERT(varchar, @count) + '] 個欄位!' ROLLBACK TRAN

16-2-5 使用UPDATE()函數-範例2 SQL指令碼檔:Ch16_2_5_02.sql 在【教授】資料表更新記錄時就會觸發執行【更新檢查】觸發程序,顯示更新哪些欄位,和更新的欄位數,如下所示: UPDATE 教授 SET 職稱 = '教授' WHERE 教授編號 = 'I003'

16-3 修改、停用與刪除DML觸發程序 16-3-1 修改觸發程序 16-3-2 停用觸發程序 16-3-3 刪除觸發程序

16-3-1 修改觸發程序- 使用Management Studio 請在「物件總管」視窗指定資料表或檢視表的觸發程序上,執行【右】鍵快顯功能表的【修改】指令,即可重新編輯觸發程序的T-SQL指令敘述。

16-3-1 修改觸發程序- 使用T-SQL指令(說明) T-SQL語言是使用ALTER TRIGGER指令來修改觸發程序,其基本語法和CREATE TRIGGER相同。 簡單的說,修改觸發程序就是重新定義觸發程序。

16-3-1 修改觸發程序- 使用T-SQL指令(範例1a) SQL指令碼檔:Ch16_3_1_01.sql 在【教務系統】資料庫的【教授】資料表修改名為【更新檢查】的觸發程序,額外顯示更新後的欄位值,如下所示: ALTER TRIGGER 更新檢查 ON 教授 AFTER UPDATE AS DECLARE @count int, @rank varchar(10), @dep varchar(5) SET @count = 0 IF UPDATE(職稱)

16-3-1 修改觸發程序- 使用T-SQL指令(範例1b) IF UPDATE(職稱) BEGIN SELECT @rank = 職稱 FROM Inserted PRINT '更新職稱: ' + @rank SET @count = @count + 1 END IF UPDATE(科系) SELECT @dep = 科系 FROM Inserted

16-3-1 修改觸發程序- 使用T-SQL指令(範例1c) PRINT '更新科系: ' + @dep SET @count = @count + 1 END IF @count > 0 BEGIN PRINT '更新 [' + CONVERT(varchar, @count) + '] 個欄位!' ROLLBACK TRAN

16-3-1 修改觸發程序- 使用T-SQL指令(範例2) SQL指令碼檔:Ch16_3_1_02.sql 在【教授】資料表更新記錄就會觸發執行【更新檢查】觸發程序,顯示更新哪些欄位、欄位值和更新欄位數,如下所示: UPDATE 教授 SET 職稱 = '講師' WHERE 教授編號 = 'I003'

16-3-2 停用觸發程序- 使用Management Studio

16-3-2 停用觸發程序- 使用T-SQL指令(語法) T-SQL語言是使用ALTER TABLE指令來停用與資料表結合的觸發程序,其語法如下所示: ALTER TABLE 資料表名稱 { ENABLE | DISABLE } TRIGGER { ALL | 觸發程序名稱 } 上述語法可以啟用或停用資料表指定或全部的觸發程序,ENABLE是啟用,DISABLE是停用,ALL是全部的觸發程序,或是指定的觸發程序名稱,如果不只一個請使用「,」逗號分隔。

16-3-2 停用觸發程序- 使用T-SQL指令(範例) SQL指令碼檔:Ch16_3_2.sql 停用【教授】資料表名為【更新檢查】的觸發程序,如下所示: ALTER TABLE 教授 DISABLE TRIGGER 更新檢查

16-3-3 刪除觸發程序- 使用Management Studio 在Manament Studio工具的「物件總管」視窗展開資料表或檢視表的觸發程序,在其上執行【右】鍵快顯功能表的【刪除】指令,再按【確定】鈕,即可刪除觸發程序。

16-3-3 刪除觸發程序- 使用T-SQL指令 T-SQL語言是使用DROP TRIGGER指令來刪除觸發程序,其基本語法如下所示: SQL指令碼檔:Ch16_3_3.sql 刪除【教授】資料表名為【更新檢查】的觸發程序,如下所示: DROP TRIGGER 更新檢查

16-4 DDL觸發程序-說明 DDL觸發程序(DDL Trigger)是一種特殊類型的觸發程序,它可以回應DDL指令(主要是指CREATE、ALTER和DROP開頭的指令)來執行資料庫的管理工作,例如:稽核與管理資料庫作業。 DDL觸發程序是在執行DDL指令後觸發執行,所以並不能建立類似DML觸發程序的INSTEAD OF觸發程序。

16-4 DDL觸發程序-時機 一般來說,在SQL Server使用DDL觸發程序的時機,如下所示: 保護資料庫綱要不會改變。 希望在更改資料庫綱要時,有一些反應來進行額外處理。 記錄資料庫綱要的改變或相關事件。

16-4 DDL觸發程序-語法 在T-SQL語言一樣是使用CREATE TRIGGER指令來建立DDL觸發程序,其基本語法如下所示: ON { ALL SERVER | DATABASE } { FOR | AFTER } 事件種類 AS T-SQL指令敘述

16-4 DDL觸發程序-範例1 SQL指令碼檔:Ch16_4_01.sql 建立名為【唯讀資料表】的DDL觸發程序,當在資料庫執行DROP TABLE或ALTER TABLE指令時,取消其操作,簡單的說,就是拒絕刪除或更改資料表設計,如下所示: CREATE TRIGGER 唯讀資料表 ON DATABASE FOR DROP_TABLE, ALTER_TABLE AS BEGIN BEGIN TRAN PRINT '資料表綱要是唯讀的!' ROLLBACK TRAN END

16-4 DDL觸發程序-範例2 SQL指令碼檔:Ch16_4_02.sql DROP TABLE 熱銷產品