zoukankan      html  css  js  c++  java
  • SQL语句(二十一)—— 触发器(DML触发器)

    触发器

    一 、触发器概述(特殊的存储过程)

    定义:

    在修改指定表值的数据时执行的 存储过程. 不同的是 : 执行存储过程要使用EXEC语句来调用,而触发器的执行不需要使用EXEC语句来调用.

    作用:

    1. 实现由主键和外键所不能保证的复制的参照完整性和数据的一致性

    1. 他能够对数据库中的相关表进行级联修改

    2. 提供比 CHECK约束 更复杂的数据完整性,并自定义错误信息。

    分类:

    1. 数据操作语言触发器 DML

      • 数据库操作语言 : update,Delete

    2. 数据定义语言触发器 DDL

      • 记录数据库更改事件

    二、创建DML触发器

    • INSERT 触发器

    • DELETE 触发器

    • UPDATE 触发器

    • 替代触发器

    • 允许使用嵌套触发器

    • 递归触发器

    5.25: 在Employee表上创建一个名为Employee_deleted的触发器,其功能: 当对表进行删除时,首先检查员工是否为 '人事部'员工,如果不是可以删除,否则撤销删除并显示'无法删除'

    Create trigger employee_delete
    on Department
    After Delete
    AS    
    Begin
        Declary @x char(10)
        Select @x = DepartmentName    --变量来自数据库,用from
        From Department
        
        if (@x = '人事部')        --没有就用变量
        Begin    
            print '无法删除'
            RollBack             --撤销都是RollBack
        End
    End
    
    --执行
    Delete From Department Where Sname = '人事部'
    • 先删除,再撤销

    Create trigger employee_delete
    on Employee
    After Delete
    AS
    Begin
        Declare @Dp varchar(50)
        Select @Dp = DepartmentName
        From Department D1, Deleted D2
        Where D1.DepartmentID = D2.DepartmentID
        If(@Dp = '人事部')
        Begin
            print '无法删除'
            RollBack
        End
    End
    • 更新触发器(返回更新的记录)

    Create trigger employee_update
    on Stu_info
    After Update
    AS
    Begin
        Declare @StuCount Int
        Select @StuCount = Count(*)
        From stu_info
    
        Update Stu_sum 
        Set number = @StuCount
    
        Select S_id As 更新前学生编号, S_name As 更新前学生姓名
        From Deleted
    
        Select S_id As 更新后学生编号, S_name As 更新后学生姓名
        From Inserted
    End
    
    --执行
    Update Stu_info
    Set S_name = '张三'
    Where S_id = 1
    • Instead of (替代触发器)先判断,再操作

    Create trigger employee_delete
    on Employee
    Instead of Delete
    AS
    Begin
        Declare @Dp varchar(50)
        Select @Dp = DepartmentName
        From Department
        If(@Dp = '人事部')
        Begin
            print '无法删除'
        End
    End
    • 禁止直接向表插入记录 操作

    Create Trigger Insert_Forbidden
    On Stu_Sum
    After Insert
    AS
    Begin
        Raiserror('不允许直接向该表插入记录, 操作被禁止', 1, 1)
        RollBack Transaction
    End
    • 触发器嵌套

      • 服务器 - > 属性 -> 杂项 -> 允许触发器激发其他触发器 -> true

    • 递归触发器

      • 数据库 -> 属性 -> 选项 -> 杂项 -> 递归触发器已启用 -> true

     

  • 相关阅读:
    import和from .xxx import *的一点重要区别
    django 的时区设置
    更新项目,uwsgi重新加载和日志文件
    jQuery将json字符串显示在页面上
    远程访问rhel7的oracle中的问题
    ORA-12514 TNS 监听程序当前无法识别连接描述符中请求服务 的解决方法
    rhel7使用centos7yum组件
    spring AOP
    public protected default private权限修饰符理解
    用idea创建web项目
  • 原文地址:https://www.cnblogs.com/douzujun/p/6819231.html
Copyright © 2011-2022 走看看