zoukankan      html  css  js  c++  java
  • 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、触发器的主要作用:实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。
    使用触发器的缺点:
            触发器功能强大,轻松可靠地实现许多复杂的功能,为什么又要慎用呢。触发器本身没有错,但由于我们的滥用会造成数据库及应用程序的维护困难。
            在数据库操作中,我们可以通过关系、触发器、存储过程、应用程序等来实现数据操作。同时规则、约束、缺省值也是保证数据完整性的重要屏障。
            如果我们对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程度
  • 相关阅读:
    图解 perspective && perspective-origin && transform3d && transform-origin
    【CSS3练习】3D盒子制作
    【CSS3练习】在圆上旋转的菜单
    【CSS3练习】transform 2d变形实例练习
    -webkit-overflow-scrolling : touch 快速滚动 回弹 效果
    【canvas】blackboard 黑板
    【canvas】高级功能一 变形
    【canvas】基础练习三 图片
    【canvas】基础练习二 文字
    【canvas】基础练习一 图形
  • 原文地址:https://www.cnblogs.com/yuxiaoyanran/p/3075233.html
Copyright © 2011-2022 走看看