Sql server数据库设计 7

                      第七章(触发器)

触发器的概念:

      触发器是一种实施复杂的,完整性约束的特殊存储过程,触发器定义在特定的表上,与表相关,自动触发执行,不能直接调用,是一个可回滚的事物。

触发器中两张特殊的表:

      inserted表:存放insert或update语句执行所影响行的副本。    

            可以从inserted表中检查插入的数据是否满足业务需求
            如果不满足,则向用户报告错误消息,并回滚插入操作

      deleted表:存放deleted或update语句执行所影响行的副本。

            可以从deleted表中检查被删除的数据是否满足业务需求
            如果不满足,则向用户报告错误消息,并回滚插入操作

    注意:只读,不允许修改,触发器执行完后,自动删除。

触发器的分类:

      根据触发器执行流程和触发事件先后的关系:after触发器和instead  of触发器

      根据触发器的命令语句划分:DML(数据操作语言)触发器,DDL(数据定义语言)触发器,DCL(数据控制语言)触发器

如何创建触发器: 

      CREATE TRIGGER trigger_name(触发器名称)

       ON table_name

       [WITH ENCRYPTION]  (加密)

        FOR [DELETE, INSERT, UPDATE](指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字)

       AS(触发器要执行的操作)

        T-SQL语句

        GO

创建insert(插入)触发器:  当向表中插入数据时触发,自动执行触发器中定义的SQL语句

     eg:、触发器: 新开一个手机账号,并在充值记录表中 保存日志说明为 ‘开户’
        if OBJECT_ID('tr_phone_kaihu','trigger') is not null
           drop trigger tr_phone_kaihu
          go
        create trigger tr_phone_kaihu
        on phone
        for insert
        as
        declare @phoneNo varchar(20)
      begin
       select @phoneNo=phoneNo from inserted
       insert into phonelog values(@phoneNo,getdate(),'开户')
      end;
        go
          declare @phoneNo varchar(20)
          set @phoneNo='18875022258'
        insert into phone values(@phoneNo,'林雪','012345678912345678',10)

delete(删除)触发器:    当删除表中记录时触发,自动执行触发器中定义的SQL语句

      eg:触发器: 删除充值记录时,显示当前手机账户的真实姓名,和身份证号码
          if OBJECT_ID('tr_phonelog_phoneNo','trigger') is not null
             drop trigger tr_phonelog_phoneNo
            go
          create trigger tr_phonelog_phoneNo
          on phonelog
          for delete
          as
          declare @phoneNo varchar(20)
          begin
           select @phoneNo=phoneNo from deleted
             select realName,idcard from phone where phoneNo=@phoneNo
          end;
          go
          delete from phoneLog where phoneNo='18623490132'

update(修改)触发器:    当更新表中某列或多列时触发,自动执行触发器中定义的SQL语句

           update触发器无论是对表中的一行或多行,还是一列或多列,都将执行触发器操作。但是在实际需求中,可能只关心对特定列是否被更新。
           如果特定的列被更新,就执行触发器操作。这可以通过列上的update语法:if update<列名>来实现。在同一个触发器的定义语句中,
           可以使用多条if update 语句来对不同的列的修改执行不同的触发器操作。

instead  of触发器的使用: 

        instead of触发器的使用范围,instead of 触发器可以同时在数据表和视图中使用。通常在以下几种情况下,建议使用instead of触发器:
        数据库里的数据禁止修改:例如电信部门的通话记录是不能修改的,一旦修改,则通话费用的计数将不准确。
        有可能要回滚修改的SQL语句
        在视图中使用触发器
        用自己的方式去修改数据

创建instead  of触发器的语法: 

          create trigger trigger_name

          on table_name

          instead of insert

           as

          sql语句

使用触发器的优点:

        1、触发器可以强制比用check约束定义的约束更为复杂的约束。触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。
          一张表中的多个同类触发器(insert、update或delete)允许采取多个不同的对策以响应同一条修改语句。
        2、触发器的主要作用:实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。
使用触发器的缺点:
        触发器功能强大,轻松可靠地实现许多复杂的功能,为什么又要慎用呢。触发器本身没有错,但由于我们的滥用会造成数据库及应用程序的维护困难。
        在数据库操作中,我们可以通过关系、触发器、存储过程、应用程序等来实现数据操作。同时规则、约束、缺省值也是保证数据完整性的重要屏障。
        如果我们对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程度
原文地址:https://www.cnblogs.com/yuxiaoyanran/p/3075233.html