当前位置: 首页 > news >正文

SQL server 触发器的使用

在 SQL Server 中,触发器(Trigger) 是一种特殊的存储过程,它在对表执行 INSERT、UPDATE 或 DELETE 操作时自动触发执行,无需手动调用。它常用于数据验证、审计日志、级联更新、同步数据等场景。

一、触发器的类型(SQL Server)

二、触发器的基本语法

CREATE TRIGGER trigger_name
ON table_name
[WITH ENCRYPTION]
FOR | AFTER | INSTEAD OF
[INSERT, UPDATE, DELETE]
AS
BEGINSET NOCOUNT ON;-- 触发器逻辑-- 可使用 INSERTED 和 DELETED 逻辑表
END

三、关键概念:INSERTED 和 DELETED 逻辑表

触发器通过两个临时逻辑表获取变更数据:

四、常见使用场景与示例

-- 目标:当 user_account 表有更新时,记录变更到 log 表CREATE TRIGGER tr_user_account_update_log
ON user_account
AFTER UPDATE
AS
BEGINSET NOCOUNT ON;INSERT INTO account_log (user_id, old_balance, new_balance, change_time, operation)SELECT d.user_id,d.balance AS old_balance,i.balance AS new_balance,GETDATE(),'UPDATE'FROM DELETED dJOIN INSERTED i ON d.id = i.id;
END

场景 2:同步数据到另一张表

-- 目标:当 BBD_FANLI_LS 有新返利插入时,同步到 BBD_FLZHBDTX 提醒表CREATE TRIGGER tr_BBD_FANLI_LS_SyncToNotice
ON BBD_FANLI_LS
AFTER INSERT
AS
BEGINSET NOCOUNT ON;INSERT INTO BBD_FLZHBDTX (user_id, order_no, amount, tx_time)SELECT user_id, order_no, rebate_amount, rebate_timeFROM INSERTED;
END

场景 3:数据验证与限制

-- 目标:禁止删除状态为 '已完成' 的订单CREATE TRIGGER tr_order_delete_check
ON orders
INSTEAD OF DELETE
AS
BEGINSET NOCOUNT ON;IF EXISTS (SELECT 1 FROM DELETED WHERE status = '已完成')BEGINRAISERROR('无法删除已完成的订单!', 16, 1);ROLLBACK TRANSACTION;RETURN;ENDELSEBEGINDELETE FROM orders WHERE id IN (SELECT id FROM DELETED);END
END

场景 4:级联更新(替代外键级联)

-- 目标:当用户姓名更改时,自动更新相关订单中的客户名CREATE TRIGGER tr_user_update_cascade
ON users
AFTER UPDATE
AS
BEGINSET NOCOUNT ON;UPDATE oSET customer_name = i.nameFROM orders oJOIN INSERTED i ON o.user_id = i.idJOIN DELETED d ON i.id = d.idWHERE i.name <> d.name; -- 仅当姓名变化时更新
END

五、触发器的管理

-- 查看某表上的触发器
SELECT * FROM sys.triggers WHERE parent_id = OBJECT_ID('your_table');-- 查看触发器定义
EXEC sp_helptext 'trigger_name';-- 查看所有触发器(排除系统自带的触发器)SELECT t.name AS TriggerName,OBJECT_NAME(t.parent_id) AS TableName,t.type_desc AS TriggerType,        -- DML or DDLt.create_date,t.modify_date,t.is_disabled
FROM sys.triggers t
WHERE t.is_ms_shipped = 0  -- 排除系统自带的触发器
ORDER BY t.create_date DESC;-- 禁用
DISABLE TRIGGER tr_user_account_update_log ON user_account;-- 启用
ENABLE TRIGGER tr_user_account_update_log ON user_account;-- 删除触发器DROP TRIGGER tr_user_account_update_log;

六、使用触发器的注意事项

http://www.dtcms.com/a/351933.html

相关文章:

  • PostgreSQL诊断系列(4/6):表空间与膨胀分析——解决“越用越大”的存储难题
  • woocommerce后台一次搜索多个ID订单的实现方法
  • 两周年创作纪念,忆笑傲江湖岁月
  • 探寻跨语言统一真理及其对NLP的未来启示
  • 项目管理软件与 Excel:哪个适合您的团队?
  • 超越MySQL:TDengine的时序数据处理革新与实践指南
  • [新启航]新启航激光频率梳 “光量子透视”:2μm 精度破除遮挡,完成 130mm 深孔 3D 建模
  • 在线提取维基百科Wikipedia文章页面及离线批处理Wikipedia XML Dump文件
  • 抽签占卜抖音快手微信小程序看广告流量主开源
  • 6.6 Element UI 加载指示器
  • 机器学习每日一题000-矩阵和向量的乘法python实现
  • Linux SSH 基于密钥交换的自动登录原理简介及配置说明
  • 数据结构第7章 查找(竟成)
  • 在 OpenLayers 中实现自定义右键菜单:基于 vue3-context-menu 的完整指南
  • 河南河北到底以哪条河为界?是黄河还是漳河呢?
  • 你真的了解操作系统吗?
  • 低代码开发实践:快速构建企业采购审批流程的技术方案
  • 无线网络中的Duration字段计算:原理、机制与实现
  • php内存缓存插件yac的安装配置--平替apcu,多进程共享内存
  • 均胜电子上半年毛利率持续提升,汽车智能化与机器人业务多点突破
  • sed流编辑:从ed到现代文本处理的进化
  • 第二篇:MySQL初始化配置与性能优化
  • 汽车零部件软件迭代开发指南
  • Spring Boot -Mybatis的使用和基础
  • 数字孪生:工厂优化的下一个前沿领域
  • GIS开源库汇总
  • Linux笔记10——shell编程基础-4
  • Web安全开发指导规范文档V1.0
  • 基于SpringBoot的美剧观影网站【2026最新】
  • WebSocket 技术详解:协议原理、握手到生产落地的一站式实践