最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SQL?Server觸發(fā)器常見應用場景和注意事項詳解

 更新時間:2026年04月10日 09:06:33   作者:愛你的橘子  
SQL?Server觸發(fā)器是一種特殊的存儲過程,它不通過用戶直接調(diào)用執(zhí)行,而是當數(shù)據(jù)庫中發(fā)生特定的數(shù)據(jù)操作語言事件時自動被激活,這篇文章主要介紹了SQL?Server觸發(fā)器常見應用場景和注意事項的相關資料,需要的朋友可以參考下

一、什么是觸發(fā)器(Trigger)?

觸發(fā)器(Trigger)是一種特殊的存儲過程,它不會被人為調(diào)用,而是在對表執(zhí)行特定操作時自動觸發(fā)執(zhí)行。

常見觸發(fā)條件包括:

  • INSERT(插入數(shù)據(jù))

  • UPDATE(更新數(shù)據(jù))

  • DELETE(刪除數(shù)據(jù))

可以理解為:

當表發(fā)生變化時,數(shù)據(jù)庫自動執(zhí)行的一段“監(jiān)聽程序”。

觸發(fā)器的典型用途

  • 數(shù)據(jù)審計(記錄誰改了什么數(shù)據(jù))

  • 數(shù)據(jù)校驗(防止非法操作)

  • 自動維護關聯(lián)數(shù)據(jù)

  • 業(yè)務規(guī)則約束(如庫存不能為負)

二、觸發(fā)器的分類

SQL Server 中主要有兩類觸發(fā)器:

1. DML 觸發(fā)器(針對表)

作用對象:INSERT / UPDATE / DELETE

分為兩種:

(1)AFTER 觸發(fā)器(之后觸發(fā))

在操作完成后執(zhí)行。

CREATE TRIGGER trg_AfterInsert
ON Student
AFTER INSERT
AS
BEGIN
    PRINT '插入數(shù)據(jù)成功'
END

(2)INSTEAD OF 觸發(fā)器(替代執(zhí)行)

替代原本的操作執(zhí)行,常用于視圖或復雜邏輯控制。

CREATE TRIGGER trg_InsteadDelete
ON Student
INSTEAD OF DELETE
AS
BEGIN
    PRINT '禁止刪除學生記錄'
END

2. DDL 觸發(fā)器(針對數(shù)據(jù)庫級操作)

用于監(jiān)聽:

  • CREATE TABLE

  • DROP TABLE

  • ALTER TABLE

  • CREATE LOGIN 等

CREATE TRIGGER trg_DDL
ON DATABASE
FOR DROP_TABLE
AS
BEGIN
    PRINT '禁止刪除表結(jié)構'
END

三、Inserted 與 Deleted 表(核心概念)

在 DML 觸發(fā)器中,SQL Server 提供了兩個虛擬表

操作Inserted 表Deleted 表
INSERT新數(shù)據(jù)
DELETE原數(shù)據(jù)
UPDATE新數(shù)據(jù)舊數(shù)據(jù)

示例:記錄學生表修改日志

CREATE TRIGGER trg_UpdateLog
ON Student
AFTER UPDATE
AS
BEGIN
    INSERT INTO StudentLog(StudentID, OldName, NewName, UpdateTime)
    SELECT d.ID, d.Name, i.Name, GETDATE()
    FROM deleted d
    JOIN inserted i ON d.ID = i.ID
END

四、觸發(fā)器的常見應用場景

1. 數(shù)據(jù)審計(日志記錄)

CREATE TRIGGER trg_InsertLog
ON Orders
AFTER INSERT
AS
BEGIN
    INSERT INTO OrderLog(OrderID, CreateTime)
    SELECT ID, GETDATE() FROM inserted
END

2. 數(shù)據(jù)校驗(防止非法數(shù)據(jù))

例如:禁止工資為負數(shù)

CREATE TRIGGER trg_CheckSalary
ON Employee
AFTER INSERT, UPDATE
AS
BEGIN
    IF EXISTS (SELECT 1 FROM inserted WHERE Salary < 0)
    BEGIN
        ROLLBACK
        RAISERROR('工資不能為負數(shù)',16,1)
    END
END

3. 維護關聯(lián)數(shù)據(jù)(如庫存)

當訂單插入時,自動減少庫存。

五、觸發(fā)器的注意事項(非常重要)

1. 觸發(fā)器是“針對集合”的,不是單行

錯誤寫法(假設只有一行):

SELECT @id = ID FROM inserted

正確思維:要按多行數(shù)據(jù)處理。

2. 不要在觸發(fā)器中寫復雜業(yè)務邏輯

原因:

  • 難調(diào)試

  • 性能差

  • 容易造成死鎖

  • 影響主業(yè)務SQL執(zhí)行

觸發(fā)器適合做:

? 校驗
? 日志
? 簡單數(shù)據(jù)同步

不適合:

? 復雜計算
? 調(diào)用外部接口
? 長事務邏輯

3. 謹慎使用 ROLLBACK

觸發(fā)器中一旦 ROLLBACK,原 SQL 操作也會失敗。

4. 注意遞歸觸發(fā)

如果觸發(fā)器中再次修改本表,可能導致無限循環(huán)。

可關閉遞歸:

ALTER DATABASE dbname SET RECURSIVE_TRIGGERS OFF

六、觸發(fā)器與存儲過程的區(qū)別

對比項觸發(fā)器存儲過程
是否自動執(zhí)行
是否可傳參
調(diào)用方式系統(tǒng)觸發(fā)手動調(diào)用
使用場景監(jiān)聽數(shù)據(jù)變化業(yè)務邏輯處理

七、最佳實踐總結(jié)

推薦使用場景:

  • 數(shù)據(jù)審計日志

  • 簡單校驗規(guī)則

  • 防誤操作保護

  • 數(shù)據(jù)同步

不推薦使用場景:

  • 核心業(yè)務邏輯

  • 高并發(fā)復雜處理

  • 跨系統(tǒng)調(diào)用

一句話原則:

觸發(fā)器 = 數(shù)據(jù)層的“守門員”,不是業(yè)務層的“指揮官”。

八、結(jié)語

SQL Server 觸發(fā)器是一把“雙刃劍”:

  • 用得好:提高數(shù)據(jù)安全性與一致性

  • 用不好:降低性能、增加維護成本

建議遵循:

少用、慎用、簡單用。

把復雜業(yè)務邏輯放在:

  • 存儲過程

  • 服務層(Java / C#)

  • 應用程序中處理

面試回答話術(簡潔版)

“觸發(fā)器主要用于實現(xiàn)復雜的業(yè)務完整性、審計日志、自動更新冗余統(tǒng)計字段以及軟刪除。但我清楚它的代價:隱式執(zhí)行、難以調(diào)試、容易引發(fā)性能問題和死鎖。

使用時我會特別注意:

基于集合處理 inserted/deleted,絕不用游標或逐行操作;

避免在觸發(fā)器內(nèi)進行耗時操作或開啟新事務;

關閉遞歸觸發(fā)器(除非有明確需求);

對批量操作做充分測試;

優(yōu)先考慮用約束、計算列或應用層邏輯替代觸發(fā)器。

總的來說,觸發(fā)器是最后的手段,能不用就不用;但遇到必須保證數(shù)據(jù)強一致性且無法用其他方法實現(xiàn)時,它是個有效的工具。”

總結(jié) 

到此這篇關于SQL Server觸發(fā)器常見應用場景和注意事項詳解的文章就介紹到這了,更多相關SQL Server觸發(fā)器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

西峡县| 余江县| 沙洋县| 正蓝旗| 波密县| 仪陇县| 拜城县| 台湾省| 太和县| 闽侯县| 会宁县| 伊金霍洛旗| 加查县| 长武县| 新宁县| 云和县| 建瓯市| 岳西县| 新竹县| 江门市| 太湖县| 剑川县| 弥勒县| 许昌市| 嵊州市| 个旧市| 平阳县| 兴文县| 张家口市| 凌海市| 陇川县| 海伦市| 定兴县| 忻城县| 乡城县| 德令哈市| 秦皇岛市| 崇仁县| 桂东县| 砚山县| 隆回县|