SQLSERVER的触发器

本文介绍了SQL触发器的概念及其在数据库中的应用。触发器是一种特殊类型的存储过程,它会在特定的数据库事件发生时自动执行,例如数据插入、更新或删除等。触发器可以用来维护数据的完整性和一致性,实现自动化备份等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

触发器的定义:触发器是一种特殊类型的存储过程,他不同于前面介绍过的一般的存储过程(在SQL内部把触发器看做是存储过程但是不能传递参数).一般的存储过程通过存储过程名称被直接调用,而触发器主要是通过事件进行触发而被执行.总的来说,触发器是一种功能强大的工具,在表中数据发生变化时自动强制执行,触发器还可以用于sqlserver约束.默认值和规则的完整性检查,还可以完成难以用普通约束实现的复杂功能
触发器的作用:
自动化操作,减少了手动操作及出错的几率

小知识点:在sqlserver数据库中隐藏的两个表
inserted,deleted表.
inserted表:当执行insert语句时,添加的数据也会加到inserted表中
deleted表:当执行delete from时,数据会放置到deleted表中.
注意,当update时,先将语句删除到deleted表中,然后在将新的数据插入到inserted表及目的表.

触发器多用于数据备份

创建一个表,表的机构和原表结构一样,但是没有数据

select top 0 into nStu from stu  //复制表stu的结构至nStu表

触发器案例:当删除学生表中的数据的同时,把删除的这个数据存放到我的新表中.

create trigger tr_stuTrigger on stu//注意触发器的写法已tr_开头
after delete
as
begin 
insert into nStu select * from deleted
end

触发器的使用建议:尽量避免在触发器中执行耗时,复杂的操作,因为触发器会与sql语句认为在同一个事务中,事务不结束,就无法释放锁.触发器编写时要多注意对多行触发时的处理.

### SQL Server 触发器概述 SQL Server中的触发器是一种特殊类型的存储过程,在特定的数据操作事件(如`INSERT`、`UPDATE`或`DELETE`)发生时会自动执行[^3]。触发器的主要用途是维护数据库的一致性和完整性。 以下是关于创建和使用SQL Server触发器的一些基本概念和示例: --- ### 创建Insert类型触发器的语法 创建一个简单的`INSERT`类型触发器,可以在指定表上定义逻辑以响应新记录的插入行为。其基础语法规则如下所示[^1]: ```sql CREATE TRIGGER trg_InsertExample ON target_table AFTER INSERT -- 可替换为FOR UPDATE, FOR DELETE等 AS BEGIN -- 在此编写Transact-SQL代码处理业务需求 END; ``` 上述脚本中指定了触发器名称(`trg_InsertExample`)及其作用的目标表(`target_table`)。通过设置`AFTER INSERT`关键字表明该触发器将在每次向目标表成功插入一条或多条记录之后运行。 --- ### 利用Inserted与Deleted临时表实现复杂逻辑 为了增强触发器的功能并支持更复杂的场景分析,SQL提供了两个内置的虚拟表——`inserted`和`deleted`。这些表格分别保存了当前事务期间涉及变动前后的原始数据副本[^2]。 #### 示例:防止非法价格更新 假设有一个产品库存管理系统的订单明细表(OrderDetails),其中包含字段OrderID、ProductID及UnitPrice。现在希望构建这样一个规则:如果有人试图降低任何已售商品的价格,则阻止这种更改的发生。 下面展示了一个满足前述条件的设计方案: ```sql -- 创建名为Prevent_Price_Decrease 的Update Trigger CREATE TRIGGER Prevent_Price_Decrease ON OrderDetails INSTEAD OF UPDATE AS BEGIN IF EXISTS ( SELECT * FROM inserted i JOIN deleted d ON i.OrderDetailID=d.OrderDetailID AND i.UnitPrice<d.UnitPrice ) RAISERROR('不允许减少单价', 16 ,1); ELSE IF NOT EXISTS ( SELECT * FROM inserted ) RETURN ; ELSE UPDATE od SET UnitPrice=i.UnitPrice FROM OrderDetails od INNER JOIN inserted i ON od.OrderDetailID =i.OrderDetailID WHERE i.UnitPrice >=d.UnitPrice END; GO ``` 在此例子中运用到了`EXISTS()`函数检测是否存在违反规定的情况;同时利用`JOIN`连接原状态(deleted)同最新提交(inserted)对比差异之处。最后采用`INSTEAD OF`代替默认动作完成定制化控制流程. --- ### 加密触发器提升安全性 有时出于安全考虑可能需要隐藏某些敏感商业逻辑或者保护知识产权不受侵犯。这时可以通过添加选项`WITH ENCRYPTION`来编译加密版本的触发程序体内容: ```sql CREATE TRIGGER SecureTriggerDemo WITH ENCRYPTION ... ``` 这样即使拥有管理员权限也无法轻易查看到实际源码细节除非掌握解密方法论。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值