首页 > 数据库 >SQL Server触发器用法

SQL Server触发器用法

时间:2024-03-08 10:34:34浏览次数:27  
标签:触发 触发器 END 示例 BEGIN Server SQL 数据

 

触发器(Trigger)是一种特殊的数据库对象,它与表相关联,并在表上的特定操作(如插入、更新、删除)发生时自动触发执行。触发器通常用于实现数据完整性约束、日志记录、审计跟踪等功能。

触发器的主要特点包括:

  • 触发时机:触发器可以在数据操作之前(Before Trigger)或之后(After Trigger)执行。

  • 事件类型:触发器可以与表的插入(INSERT)、更新(UPDATE)或删除(DELETE)操作相关联。

  • 执行逻辑:触发器可以执行一系列的SQL语句,包括查询、修改数据等。

触发器的优点包括:

  • 数据完整性:触发器可以在数据操作之前或之后执行验证和修正操作,确保数据的完整性。

  • 自动化处理:触发器可以自动执行,无需手动干预,提高了数据处理的一致性和效率。

  • 日志记录和审计:触发器可以用于记录数据变化和审计跟踪,方便后续分析和追踪数据的变更历史。

总之,存储过程和触发器是数据库中常用的对象,用于实现特定的业务逻辑和数据操作。存储过程通常用于执行复杂的数据操作和业务处理,而触发器则用于实现数据完整性约束和自动化处理。它们在数据库设计和应用开发中都扮演着重要的角色。

 

在 SQL Server 中,触发器可以在以下几个时机被触发:

 

1. 在插入数据之前触发(BEFORE INSERT):在将数据插入到表中之前触发触发器。可以在触发器中对将要插入的数据进行修改或验证。

 - 示例:在插入新员工数据之前,触发器可以自动为新员工生成一个唯一的员工编号。
   - 触发器代码示例:
     ```sql
     CREATE TRIGGER trgBeforeInsertEmployee
     ON Employee
     BEFORE INSERT
     AS
     BEGIN
         SET NEW.EmployeeID = (SELECT MAX(EmployeeID) + 1 FROM Employee)
     END
     ```

 

2. 在插入数据之后触发(AFTER INSERT):在将数据插入到表中之后触发触发器。可以在触发器中执行与插入数据相关的其他操作。

 - 示例:在插入新订单数据之后,触发器可以自动更新客户的最近订单日期。
   - 触发器代码示例:
     ```sql
     CREATE TRIGGER trgAfterInsertOrder
     ON Orders
     AFTER INSERT
     AS
     BEGIN
         UPDATE Customers
         SET LastOrderDate = GETDATE()
         WHERE CustomerID IN (SELECT CustomerID FROM inserted)
     END
     ```

 

3. 在更新数据之前触发(BEFORE UPDATE):在更新表中的数据之前触发触发器。可以在触发器中对将要更新的数据进行修改或验证。

 - 示例:在更新产品价格之前,触发器可以验证价格是否在有效范围内。
   - 触发器代码示例:
     ```sql
     CREATE TRIGGER trgBeforeUpdateProduct
     ON Products
     BEFORE UPDATE
     AS
     BEGIN
         IF UPDATE(UnitPrice) -- 只在更新 UnitPrice 字段时触发
         BEGIN
             IF NOT EXISTS (SELECT * FROM inserted WHERE UnitPrice BETWEEN 0 AND 100)
             BEGIN
                 RAISERROR('Invalid price range', 16, 1)
                 ROLLBACK
             END
         END
     END
     ```

 

4. 在更新数据之后触发(AFTER UPDATE):在更新表中的数据之后触发触发器。可以在触发器中执行与更新数据相关的其他操作。

- 示例:在更新订单状态之后,触发器可以记录状态变更的日志。
   - 触发器代码示例:
     ```sql
     CREATE TRIGGER trgAfterUpdateOrder
     ON Orders
     AFTER UPDATE
     AS
     BEGIN
         INSERT INTO OrderLog (OrderID, OldStatus, NewStatus, ChangeDate)
         SELECT o.OrderID, d.Status, i.Status, GETDATE()
         FROM inserted i
         INNER JOIN deleted d ON i.OrderID = d.OrderID
     END
     ```

 

5. 在删除数据之前触发(BEFORE DELETE):在从表中删除数据之前触发触发器。可以在触发器中对将要删除的数据进行修改或验证。

- 示例:在删除客户数据之前,触发器可以检查是否有关联的订单存在。
   - 触发器代码示例:
     ```sql
     CREATE TRIGGER trgBeforeDeleteCustomer
     ON Customers
     BEFORE DELETE
     AS
     BEGIN
         IF EXISTS (SELECT * FROM Orders WHERE CustomerID IN (SELECT CustomerID FROM deleted))
         BEGIN
             RAISERROR('Cannot delete customer with associated orders', 16, 1)
             ROLLBACK
         END
     END
     ```

 

6. 在删除数据之后触发(AFTER DELETE):在从表中删除数据之后触发触发器。可以在触发器中执行与删除数据相关的其他操作。

- 示例:在删除产品数据之后,触发器可以更新相关订单中的产品信息。
   - 触发器代码示例:
     ```sql
     CREATE TRIGGER trgAfterDeleteProduct
     ON Products
     AFTER DELETE
     AS
     BEGIN
         UPDATE Orders
         SET ProductID = NULL
         WHERE ProductID IN (SELECT ProductID FROM deleted)
     END
     ```

 

需要注意的是,触发器可以在每个操作(插入、更新、删除)的不同阶段触发,即在执行操作之前或之后触发。这样可以在触发器中执行不同类型的操作,根据需要进行数据的修改、验证或其他处理。

标签:触发,触发器,END,示例,BEGIN,Server,SQL,数据
From: https://www.cnblogs.com/jianxiaoxiu/p/18060433

相关文章

  • MySQL的页与行格式
    什么是MySQL的页?页是指存储引擎使用的最小的数据存储单位。当MySQL执行读取或写入操作时,是以页为基本单位来进行操作的。即使读写一条数据,MySQL也会按页操作。MySQL的存储引擎会将数据分成多个页,并根据需要将这些页加载到内存中进行处理。通过使用页来组织数据,MySQL能够......
  • sql server 基础
    目录若没有想看的可离开,从目录点击可到指定地方一.创建库、创建表、注释增删改、字段增删改、常用数据类型1.创建库2.创建表3.注释增删改4.字段增删改5.常用数据类型二、基本增删改查、关联删改查1.基本增删改查​编辑2.关联删改查三、视图、存储过程、......
  • 达梦不支持filter类型的执行路径导致慢SQL
     达梦不支持filter类型的执行路径导致慢SQL 最近有个政府项目的库往政务云上迁移到达梦库,源库的业务量不是很大,库本身也不大。迁移后抓取达梦的AWR,发现有一条SQL每次执行需要15s多,而在原来的Oracle里边执行0.1s。查看后发现是达梦不支持filter执行路径导致的。模拟如下:创......
  • MYSQL学习笔记1: DDL的库表操作
    SQL语句分类DDL数据定义语言,用来定义数据库对象(数据库,表,字段)DML数据操作语言,用来对数据库中表的数据进行增删改DQL数据库查询语言,用于查询数据库中表的记录DCL数据控制语言,用来创建数据库用户、控制数据库的访问权限DDL数据定义语言,用来定义数据库对象(数据......
  • Docker搭建Mysql集群
    一、新建主服务器示例3307dockerrun-p3307:3306--namemysql-master\-v/docker-volume/mysql-master/log:/var/log/mysql\-v/docker-volume/mysql-master/data:/var/lib/mysql\-v/docker-volume/mysql-master/conf:/etc/mysql\-eMYSQL_ROOT_PASSWORD=root\-d......
  • MySQL-01.Linux下MySQL安装和使用
    C-01.Linux下MySQL的安装和使用前置说明,MySQL高级部分,需要前置知识,为Linux操作系统。如果没有该部分知识,这里推荐韩顺平老师的Linux操作系统的教程。韩老师Linux教程1.安装前准备1.1Linux系统及工具的准备安装并启动好两台虚拟机:CentOS7版本掌握克隆虚拟机的操作mac地......
  • MYSQL意向锁的作用
    结论:当一个事务要对表进行锁定时,首先会获取相应的意向锁。其他事务可以通过检查意向锁来判断是否有其他事务在更细粒度的级别上对表进行了锁定。这有助于避免冲突和提高并发性能在讨论此问题之前我们应当明确两个前提:Innodb存储引擎支持行锁和表锁共存行锁与表锁之间互不冲突......
  • MSSQL遇到以零作除数错误的处理方法
    https://www.cnblogs.com/huolarry/p/5766057.html在sql server中做除法处理的时候,我们经常需要处理除数为零的情况,因为如果遇到这种情况的时候,sqlserver会抛出遇到以零作除数错误的异常,我们总不希望把这个异常显示给用户吧。做个会报这个错误的示例,如以下sql代码:declare @a ......
  • Mybatis20_MyBatis映射文件深入(动态SQL)6
    一、动态sql语句1、动态sql语句概述Mybatis的映射文件中,前面我们的SQL都是比较简单的,有些时候业务逻辑复杂时,我们的SQL是动态变化的,此时在前面的学习中我们的SQL就不能满足要求了。2、环境搭建UserMapper.javapackagecom.itheima.mapper;importcom.......
  • Java编程--观察者(Observer)设计模式
    观察者设计模式观察者设计模式是一种行为设计模式,允许对象在其状态改变时通知其他依赖对象。它创建了一种发布者(Subject)和订阅者(Observer)之间的依赖关系。这种模式经常用于实现事件处理系统。观察者模式的关键组成部分:Subject(主题):拥有添加和删除观察者的方法,以及通知所有观察......