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

    本文非原创

    一.触发器:

    是一种特殊的存储过程,其特殊性在于它并不需要用户来执行、
    调用,在表中数据进行修改时,自动执行,来实现复杂的完整性约束,
    防止对数据不正确的修改。

    1.定义:它是一段能够自动执行的程序,当对象进行 update,insert,
    delete 时,自动执行,它没有参数,不允许被调用。

    2.触发器的优点: (1)级联修改
    (2)实现复杂约束
    (3)检查数据
    (4)控制修改表时合乎业务规则

    二.触发器的激活时机:

    1.后触发:当引起触发器执行的修改语句执行完成,并通过约束后才
    执行触发器,这种触发叫后触发。

    关键字:after / for 后触发只能创建在表上,
    而不能创建在视图上。


    2.替代触发:引起触发器执行的修改语句停止执行,仅执行触发器,
    这种触发方式叫替代触发。

    关键字:instead of 替代触发可以创建在表或视图上。


    三.Inserted临时表和Deleted临时表:

    每个触发器被执行时,系统都会为触发器创建两个系统临时表,
    这两个临时表的结构与激活触发器的表的结构完全相同,触发器执行
    完成后,这两个临时表都会被删除,可以用select语句来查询,
    但不能对其修改。

    inserted ----->插入操作(保存更新的数据)
    deleted ----->删除操作(保存原来的数据)

    语法:create trigger 拥有者.触发器名称 on [拥有者]
    {表名称 / 视图名称}
    for / after / instead of [insert,update,delete]
    [with encryption]
    as
    SQL 语句




    例: ----后触发:

    (1)create trigger del_goods on goods
    after delete
    as
    delete orders where 货品名称
    in (select 货品名称 from deleted)
    go
    delete goods where 货品名称='jj'
    if not exists(select * from orders where 货品名称='ff')
    print '相关记录已从orders表中删除掉!'

    (2)create trigger ins_orders on orders
    after insert
    as
    declare @x char(20),@y bit
    select @x=货品名称 from inserted ------>创建临时表
    select @y=状态 from goods where 货品名称=@x
    if @y=1
    begin
    print ('本货品正在整理中,现在不能下订单')
    rollback transaction ------->回滚(将刚才执行的操作取消)
    end
    go
    insert orders (货品名称,可湖编号,数量)values('ls',303,5)
    select * from orders where 货品名称='d'


    -----替代触发:
    (1)create trigger ins_orders1 on orders
    instead of insert
    as
    declare @x char(20),@y bit
    select @x=货品名称 from goods where 货品名称=@x
    select @y=状态 from goods where 货品名称=@x
    if @y=1
    begin
    print('本货品正在整理中,现在不能下订单')
    end
    else
    begin
    insert orders(货品名称,可湖编号,数量)values (@x,@y)
    end
    go
    insert orders(货品名称,可湖编号,数量)values ('ls',303,5)
    select *from ordes where 货品名称='desk'



    (2)create trigger YI_tri on YI
    instead of insert
    as
    declare @zhi varchar(23),@shu int
    select @zhi=book_addr,@shu=book_num from inserted
    if @zhi='hgf'
    begin
    print 'haha'
    end
    else
    begin
    --insert YI(book_addr,book_num,book_name)values(@zhi,@shu,'LOVE')
    print 'I Love You!'
    end
    go
    insert YI(book_addr,book_num,book_name)values('sdfs',100,'str')

    注意:不能在临时表或系统表上建立触发器,也不能在视图上建立后触发。

    四.字段不被修改:

    例:create trigger upd_orders on orders
    after update
    as
    if update(定货日期)
    begin
    raiserror('123456789',16,1)
    rollback transaction
    end

    五.重命名触发器:

    语句:[execute] sp_rename 原触发器名称,触发器新名称

    例:execute sp_rename ins_ordfers1,xinming


    六.查看触发器:
    (1)查看触发器的名称、类型、所有者和建立时间:

    语句: [execute] sp_help 触发器名称

    例: execute sp_help upd_orders

    (2)查看一个表中触发器的类型:

    语句: [execute] sp_helptrigger 触发器所属表的名称

    例: execute sp_helptrigger orders


    (3)查看一个未加密的触发器的定义:

    语句: [execute] sp_helptext 触发器名称

    例: execute sp_helptext xinming

    (4)查看一个触发器的依赖关系:

    语句: [execute] sp_depends 触发器名称

    例: execute sp_depends del_goods

    七.禁止触发器:

    语句: alter table 表名
    disable trigger 触发器名

    例: alter table orders
    disable trigger ins_orders


    八.启用触发器:

    语句: alter table 表名
    enable trigger 触发器名

    例: alter table orders
    enable trigger ins_orders


    九.删除触发器:


    语句: drop trigger 触发器名 [……n]


    例: drop trigger del_goods



  • 相关阅读:
    Python使用SMTP模块、email模块发送邮件
    harbor搭建及使用
    ELK搭建-windows
    ELK技术栈之-Logstash详解
    【leetcode】1078. Occurrences After Bigram
    【leetcode】1073. Adding Two Negabinary Numbers
    【leetcode】1071. Greatest Common Divisor of Strings
    【leetcode】449. Serialize and Deserialize BST
    【leetcode】1039. Minimum Score Triangulation of Polygon
    【leetcode】486. Predict the Winner
  • 原文地址:https://www.cnblogs.com/xieyuanzheng/p/5597073.html
Copyright © 2011-2022 走看看