什么是触发器及简单例子

触发器是一种特殊的存储过程,类似于其它编程语言中的事件函数,SQL Server™ 允许为 INSERT、UPDATE、DELETE 创建触发器,当在表(视图)中插入、更新、删除记录时,触发一个或一系列 T-SQL 语句。

触发器分为两种一个是INSTEAD OF 触发器;一个是AFTER 触发器。

AFTER 触发器(也叫“FOR”触发器)会在触发 insert、update 或是delect 动作之后执行。例如,一个 Employees 表上的 AFTER 触发器会在在 Employee 表上执行一条 update 语句后激活。因此,AFTER 触发器只有在已插入一行或是多行和所有约束已被处理且通过后才触发。INSTEAD OF 触发器和 AFTER 触发器有本质上的不同,因为 INSTEAD OF 触发器代替触发动作进行激发。就拿同样的例子来说,如果在 Emplyees 表上有一个 INSTEAD OF UPDATE 触发器和在这个表上执行一条 UPDATE 语句,结果是这条 UPDATE 语句并不会改变 Employee 表中的任何一行。相反,这条 UPDATE 语句只有是为了踢离 INSTEAD OF UPDATE 触发器,这个触发器可能会,也可能不会改变 Employees 表中的数据。
  因此,怎么决定在合适的时间和位置放置 INSTEAD OF 触发器呢?有几个关键的因素在做决定是值得考虑的。AFTER 触发器多用在动作必须在表中数据发生改变之后才执行后情情况。比如,AFTER 触发器可以用于将对数据作任何变动的日志记录在一个相对独立的审计表中。INTEAD OF 触发器也能做同样的工作。但是 INSTEAD OF 触发器在这个情况下的效率比较低,因为更新动作只能在将它发生的动作准确地记录在审计表之后才允许执行。

注意:不能在触发器中使用的语句

 触发器中可以使用大多数 T-SQL 语句,但如下一些语句是不能在触发器中使用的。

  • CREATE 语句,如:CREATE DATABASE、CREATE TABLE、CREATE INDEX 等。
  • ALTER 语句,如:ALTER DATABASE、ALTER TABLE、ALTER INDEX 等。
  • DROP 语句,如:DROP DATABASE、DROP TABLE、DROP INDEX 等。
  • DISK 语句,如:DISK INIT、DISK RESIZE。
  • LOAD 语句,如:LOAD DATABASE、LOAD LOG。
  • RESTORE 语句,如:RESTORE DATABASE、RESTORE LOG。
  • RECONFIGURE
  • 说明:有人说不能用 TRUNCATE TABLE 语句,其实是可以的。

触发器例子:

 比如,这么两个表:
  Create Table Student(         --创建学生表
    StudentID int primary key,     --学号,定义主键约束
    ....
    )

  Create Table BorrowRecord(         --创建借书记录表
    BorrowRecord int identity(1,1),     --自动增长流水号 
    StudentID   int ,             --学号
    BorrowDate   datetime,           --借出时间
    ReturnDAte   Datetime,           --归还时间
    ...
  )

  用到的功能有:
    1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);
    2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。
  等等。

  这时候可以用到触发器。对于1,创建一个Update触发器:
 -------------------------------------------------------
  --Name:truStudent
  --func:更新BorrowRecord 的StudentID,与Student同步。
  --Use :None
  --User:System
  --Author: wp_love
  --Date : 2007-11-16
  --Memo : 临时写写的,给大家作个Sample。没有调试阿。
  -------------------------------------------------------
  Create Trigger truStudent
    On Student
    for Update   --触发器类型--Update
 
  As
    if Update(StudentID)
    begin

    Update BorrowRecord 
      Set br.StudentID=i.StudentID
      From BorrowRecord br , Deleted d ,Inserted i 
      Where br.StudentID=d.StudentID

    end     
          
  理解触发器里面的两个临时的表:Deleted , Inserted 。注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。
  一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted表,然后删除Student记录并写入新纪录。

  对于2,创建一个Delete触发器

  -------------------------------------------------------
  --Name:trdStudent
  --func:同时删除 BorrowRecord 的数据
  --Use :None
  --User:System
  --Author: 
  --Date : 2007-11-16
  --Memo : 临时写写的,给大家作个Sample。没有调试阿。
  -------------------------------------------------------
  Create trigger trdStudent
      On Student
      for Delete
  
  As
    Delete BorrowRecord 
    From BorrowRecord br , Delted d
    Where br.StudentID=d.StudentID

  从这两个例子我们可以看到了触发器的关键:A.2个临时的表;B.触发机制。
  这里我们只讲解最简单的触发器。

 
<think>嗯,用户现在问的是“简要总结什么是触发器”,我需要先回顾之前对话的历史。之前的对话是关于使用KNN算法预测国家线,现在的问题突然转到了数据库中的触发器,所以用户可能是在学习不同的技术点,需要快速了解触发器的基本概念。 首先,我要确定触发器的定义。触发器是数据库中的一种特殊存储过程,当特定事件(如INSERT、UPDATE、DELETE)发生时自动执行。用户可能需要知道它的主要作用,比如维护数据完整性、审计跟踪、自动执行业务逻辑等。 接下来,用户要求的是“简要总结”,所以回答需要简洁,但也要涵盖关键点。应该包括触发器的定义、触发事件、执行时间(BEFORE/AFTER)、应用场景和优缺点。 可能用户是数据库初学者,或者正在准备考试,需要快速掌握触发器的要点。因此,结构要清晰,分点列出,方便理解。同时,避免使用过于专业的术语,用简单的中文解释。 需要检查是否有遗漏的重要信息,比如触发器的类型(行级和语句级触发器的区别),但如果是简要总结,可能不需要深入细节。另外,应用场景部分要举例子,比如自动更新统计信息,这样用户更容易联想实际用途。 还要注意触发器的优缺点,比如优点中的自动化,缺点中的性能影响和维护困难,这样用户能全面理解何时使用触发器合适,何时可能有问题。 最后,确保回答符合之前系统级指令的要求:使用中文,行内公式用$...$(虽然触发器可能不涉及数学公式,但如果有例子中的情况可能需要),结构清晰分步骤或分点。同时,用户可见层要结构清晰,帮助用户逐步理解。</think>### **触发器的核心定义与特性总结** --- #### **一、本质与工作机制** 1. **数据库自动化工具** - 触发器(Trigger)是**预定义的存储过程**,与特定数据库表绑定。 - **触发条件**:当指定事件(`INSERT`/`UPDATE`/`DELETE`)发生时自动激活,无需手动调用。 2. **执行时机** - `BEFORE`:在数据修改操作**前**执行(例如:验证输入合法性)。 - `AFTER`:在数据修改操作**后**执行(例如:记录日志)。 - `INSTEAD OF`(仅视图):替代原操作执行自定义逻辑。 --- #### **二、核心应用场景** 1. **数据完整性维护** - 自动检查约束:例如,当插入订单时,触发器验证库存量是否充足(`IF stock < 0 THEN ROLLBACK`)。 2. **审计追踪** - 记录变更历史:通过`AFTER UPDATE`触发器将旧数据写入日志表。 ```sql CREATE TRIGGER log_salary_change AFTER UPDATE ON employees FOR EACH ROW INSERT INTO audit_log VALUES (OLD.salary, NEW.salary, NOW()); ``` 3. **级联操作** - 自动同步数据:删除用户时,级联删除其关联的订单记录。 ```sql CREATE TRIGGER cascade_delete_orders AFTER DELETE ON users FOR EACH ROW DELETE FROM orders WHERE user_id = OLD.id; ``` --- #### **三、关键分类** 1. **行级触发器(FOR EACH ROW)** - 针对受影响的**每一行数据**单独触发(例如:为每条插入的记录生成唯一ID)。 2. **语句级触发器** - 针对整个SQL语句**仅触发一次**(例如:统计批量删除的总行数)。 --- #### **四、优缺点分析** | **优点** | **缺点** | |------------------------------|------------------------------| | 自动化数据管理,减少代码冗余 | 隐式执行,调试困难 | | 强制实施复杂业务规则 | 频繁触发可能降低性能 | | 跨应用统一逻辑(数据库层实现)| 维护成本高(需跟踪多表依赖) | --- #### **五、典型示例(MySQL)** ```sql -- 创建BEFORE INSERT触发器:自动设置注册时间 DELIMITER $$ CREATE TRIGGER set_registration_time BEFORE INSERT ON users FOR EACH ROW BEGIN SET NEW.registration_date = NOW(); -- NEW表示新插入的行 END$$ DELIMITER ; ``` --- ### **总结** 触发器是数据库实现**自动化响应数据变更**的核心机制,适用于数据校验、日志记录、级联更新等场景,但需谨慎设计以避免性能瓶颈和逻辑循环。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值