共計 4115 個字符,預計需要花費 11 分鐘才能閱讀完成。
如何分析 SQL Server 數據庫觸發器概念、原理及案例,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面丸趣 TV 小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
概述
觸發器 (trigger) 是 SQL server 提供給程序員和數據分析員來保證數據完整性的一種方法,它是與表事件相關的特殊的存儲過程,它的執行不是由程序調用,也不是手工啟動,而是由事件來觸發,當對一個表進行操作 ( insert,delete,update) 時就會激活它執行。觸發器經常用于加強數據的完整性約束和業務規則等。
一、觸發器的優點
1. 觸發器是自動的。當對表中的數據做了任何修改之后立即被激活。
2. 觸發器可以通過數據庫中的相關表進行層疊修改。
3. 觸發器可以強制限制。這些限制比用 CHECK 約束所定義的更復雜。與 CHECK 約束不同的是,觸發器可以引用其他表中的列。
二、觸發器的分類
SqlServer 包括三種常規類型的觸發器:DML 觸發器、DDL 觸發器和登錄觸發器。
1.DML(數據操作語言,Data Manipulation Language)觸發器
DML 觸發器是一些附加在特定表或視圖上的操作代碼,當數據庫服務器中發生數據操作語言事件時執行這些操作。SqlServer 中的 DML 觸發器有三種:
insert 觸發器: 向表中插入數據時被觸發;
delete 觸發器:從表中刪除數據時被觸發;
update 觸發器:修改表中數據時被觸發。
當遇到下列情形時,應考慮使用 DML 觸發器:
通過數據庫中的相關表實現級聯更改
防止惡意或者錯誤的 insert、update 和 delete 操作,并強制執行 check 約束定義的限制更為復雜的其他限制。
評估數據修改前后表的狀態,并根據該差異才去措施。
2.DDL(數據定義語言,Data Definition Language)觸發器
DDL 觸發器是當服務器或者數據庫中發生數據定義語言 (主要是以 create,drop,alter 開頭的語句) 事件時被激活使用,使用 DDL 觸發器可以防止對數據架構進行的某些更改或記錄數據中的更改或事件操作。
3. 登錄觸發器
登錄觸發器將為響應 LOGIN 事件而激發存儲過程。與 SQL Server 實例建立用戶會話時將引發此事件。登錄觸發器將在登錄的身份驗證階段完成之后且用戶會話實際建立之前激發。因此,來自觸發器內部且通常將到達用戶的所有消息 (例如錯誤消息和來自 PRINT 語句的消息) 會傳送到 SQL Server 錯誤日志。如果身份驗證失敗,將不激發登錄觸發器。
三、觸發器的工作原理
[DELETE, INSERT, UPDATE]對應為當執行刪除、插入、更新三種動作時被觸發
執行 insert 時,獲取插入后的數據,可用 select*from inserted 讀取
執行 delete 時,獲取刪除前的數據,可用 select*from deleted 讀取
執行 update 時,獲取更新前的數據,可用 select*from deleted 讀取,獲取更新后數據,可用 select*from inserted 讀取
四、創建觸發器
1、創建觸發器的語法:
CREATE TRIGGER trigger_name ON table_name [WITH ENCRYPTION] FOR | AFTER | INSTEAD OF [DELETE, INSERT, UPDATE] AS T-SQL 語句 GO --with encryption 表示加密觸發器定義的 sql 文本 --delete,insert,update 指定觸發器的類型
2、創建 insert 觸發器
-- 創建 insert 觸發器 create trigger trig_insert on student after insert as begin if object_id(N student_sum ,N U) is null-- 判斷 student_sum 表是否存在 create table student_sum(stuCount int default(0));-- 創建存儲學生人數的 student_sum 表 declare @stuNumber int; select @stuNumber = count(*)from student; if not exists (select * from student_sum)-- 判斷表中是否有記錄 insert into student_sum values(0); update student_sum set stuCount =@stuNumber; -- 把更新后總的學生數插入到 student_sum 表中 end -- 測試觸發器 trig_insert-- 功能是向 student 插入數據的同時級聯插入到 student_sum 表中,更新 stuCount -- 因為是后觸發器,所以先插入數據后,才觸發觸發器 trig_insert; insert into student(stu_name,stu_gender,stu_age)values(呂布 , 男 ,30); select stuCount 學生總人數 from student_sum; insert into student(stu_name,stu_gender,stu_age)values(貂蟬 , 女 ,30); select stuCount 學生總人數 from student_sum; insert into student(stu_name,stu_gender,stu_age)values(曹阿瞞 , 男 ,40); select stuCount 學生總人數 from student_sum;
3、創建 delete 觸發器
用戶執行 delete 操作,就會激活 delete 觸發器,從而控制用戶能夠從數據庫中刪除數據記錄,觸發 delete 觸發器后,用戶刪除的記錄會被添加到 deleted 表中,原來表的相應記錄被刪除,所以在 deleted 表中查看刪除的記錄。
-- 創建 delete 觸發器 create trigger trig_delete on student after delete as begin select stu_id as 已刪除的學生編號,stu_name stu_gender,stu_age from deleted end; -- 執行一一條 delete 語句觸發 trig_delete 觸發器 delete from student where stu_id=1;
4、創建 UPDATE 觸發器
update 觸發器是當用戶在指定表上執行 update 語句時被調用被調用,這種類型的觸發器用來約束用戶對數據的修改。update 觸發器可以執行兩種操作:更新前的記錄存儲在 deleted 表中,更新后的記錄存儲在 inserted 表中。
-- 創建 update 觸發器 create trigger trig_update on student after update as begin declare @stuCount int; select @stuCount=count(*) from student; update student_sum set stuCount =@stuCount; select stu_id as 更新前學生編號,stu_name as 更新前學生姓名 from deleted select stu_id as 更新后學生編號,stu_name as 更新后學生姓名 from inserted end -- 創建完成,執行一條 update 語句觸發 trig_update 觸發器 update student set stu_name= 張飛 where stu_id=2;
五、管理觸發器
1. 查看觸發器
(1). 查看數據庫中所有的觸發器
-- 查看數據庫中所有的觸發器 use 數據庫名 go select * from sysobjects where xtype= TR
sysobjects 保存著數據庫的對象,其中 xtype 為 TR 的記錄即為觸發器對象。在 name 一列,我們可以看到觸發器名稱。
(2).sp_helptext 查看觸發器內容
use 數據庫名 go exec sp_helptext 觸發器名稱
將會以表的樣式顯示觸發器內容。
除了觸發器外,sp_helptext 還可以顯示 規則、默認值、未加密的存儲過程、用戶定義函數、視圖的文本。
(3).sp_helptrigger 用于查看觸發器的屬性
sp_helptrigger 有兩個參數:第一個參數為表名; 第二個為觸發器類型,為 char(6) 類型,可以是 INSERT、UPDATE、DELETE,如果省略則顯示指定表中所有類型觸發器的屬性。
-- 查看數據庫中所有的觸發器 use 數據庫名 go select * from sysobjects where xtype= TR
use 數據庫名 goexec sp_helptrigger tableName
2. 禁用啟用觸發器
禁用:alter table 表名 disable trigger 觸發器名稱
啟用:alter table 表名 enable trigger 觸發器名稱
如果有多個觸發器,則各個觸發器名稱之間用英文逗號隔開。
如果把“觸發器名稱”換成“ALL”,則表示禁用或啟用該表的全部觸發器。
3. 修改觸發器
-- 修改觸發器語法 ALTER TRIGGER trigger_name ON table_name [ WITH ENCRYPTION ] FOR {[DELETE][,][INSERT][,][UPDATE]} AS sql_statement;
4. 刪除觸發器
-- 語法格式: DROP TRIGGER { trigger } [ ,...n ] 參數: trigger: 要刪除的觸發器名稱 n: 表示可以刪除多個觸發器的占位符
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注丸趣 TV 行業資訊頻道,感謝您對丸趣 TV 的支持。