zoukankan      html  css  js  c++  java
  • SQL 触发器

    触发器:

            触发器为特殊类型的存储过程,可在执行语言事件时自动生效。SQL Server 包括三种常规类型的触发器:DML 触发器、DDL 触发器和登录触发器。

            当服务器或数据库中发生数据定义语言 (DDL) 事件时将调用 DDL 触发器。登录触发器将为响应 LOGON 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。      

             当数据库中发生数据操作语言 (DML) 事件时将调用 DML 触发器。DML 事件包括在指定表或视图中修改数据的 INSERT 语句、UPDATE 语句或 DELETE 语句。DML 触发器可以查询其他表,还可以包含复杂的 Transact-SQL 语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到错误(例如,磁盘空间不足),则整个事务即自动回滚。

            主要讲述DML触发器,DML触发器有两种:AFTER(FOR),INSTEAD OF触发器,同时DML 触发器使用 deleted 和 inserted 逻辑(概念)表。 它们在结构上类似于定义了触发器的表,即对其尝试执行了用户操作的表。 在 deleted 和 inserted 表保存了可能会被用户更改的行的旧值或新值。

    • 对于INSERT 操作,inserted保留新增的记录,deleted无记录
    • 对于DELETE 操作,inserted无记录,deleted保留被删除的记录
    • 对于UPDATE操作,inserted保留修改后的记录,deleted保留修改前的记录

    --禁用所有触发器的语句
    alter table student disable trigger all 
    --启用所有触发器的语句
    alter table student enable trigger all 
    --如果知道触发器的名字,可以将all改成所要关闭或启用的触发器的名称

    示例一:

    (1)、

    create trigger TR_student_Delete --创建一个delete触发器
    on student --对于那一个表的
    instead of delete --替换掉delete 语句
    as
    insert into student values('成龙','男','三班',1007,1008,1009)
    go
    --执行一个delete语句,针对student表
    delete from student where code =4
    --执行上面语句的时候触发了TR_student_Delete触发器
    --因为里面是instead of 是替换掉我执行的这个delete语句
    --所以,code为4的数据没有被删除
    --并且添加进去了一行新的数据

    (2)、

    create trigger TR_student_Delete2 --创建一个delete触发器
    on student --对于那一个表的
    for delete --在执行了外部的delete语句后执行触发器里面的语句
    as --与after相同
    insert into student values('全智贤','女','二班',1004,1005,1006)
    go
    --执行delete语句
    delete from student where code =30
    --执行delete语句在student表上的时候,发现有触发器
    --查看到是for或after
    --首先执行完要执行的这个语句
    --然后执行触发器里面的语句

    示例二:
    --执行删除一条数据,
    --用deleted来表示被删除的那条数据,可以从中获取值
    create trigger TR_Teacher_delete
    on teacher
    instead of delete
    as
    declare @code int
    select @code =(select code from deleted)
    update teacher set name ='刘德华' where code = @code
    go
    --执行
    delete from teacher where code = 1005
    --上面的语句是应该在触发器前执行,所以用deleted表示这条数据
    --可以在触发器中获取这行数据里面的任何列
    --可以直接拿去使用

    示例三:
    --insert添加一条数据,inserted表示新添加的数据,
    --从中获取教师编号,
    --并且根据教师编号来查看是lesson是音乐么,如果是音乐变成语文。
    create trigger TR_teacher_Insert
    on teacher
    for insert
    as
    declare @code int
    select @code = (select code from inserted)
    declare @lesson char(10)
    select @lesson = lesson from teacher where code =@code
    if @lesson='音乐'
    update teacher set lesson ='语文' where code =@code
    go
    --执行
    insert into teacher values('谭咏麟','音乐',55,'1950-04-05')

    --对于INSERT 操作,inserted保留新增的记录,deleted无记录
    --对于DELETE 操作,inserted无记录,deleted保留被删除的记录
    --对于UPDATE操作,inserted保留修改后的记录,deleted保留修改前的记录

  • 相关阅读:
    最新的Delphi版本号对照
    SuperObject生成示例
    Why does Delphi XE7 IDE hangs and fails on out of memory exception?
    使用 TRESTClient 与 TRESTRequest 作为 HTTP Client(转)
    Delphi提取PDF文本
    (3)PyCharm中Flask工程逆向生成数据库表
    (2)PyCharm开发Flash项目之蓝图构建
    (1)PyCharm开发工具安装Flask并创建helloworld程序
    使用localStorage写一个简单的备忘录
    一个Redis实例适合存储不同应用程序的数据吗?
  • 原文地址:https://www.cnblogs.com/gengxin/p/5191110.html
Copyright © 2011-2022 走看看