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



  • 相关阅读:
    [C++对象模型][4]指针与字符串
    [C++/CLI编程宝典][4]第一个C++/CLI程序
    [C++/CLI编程宝典][5]编译与反汇编
    Linux下软件安装卸载
    [C++/CLI编程宝典][7]基本概念
    Ubuntu linux安装ssh server
    [C++对象模型][2]指针与引用
    虚拟机vmwaretools+virtualboxguestadditions
    [C++/CLI编程宝典][6]IL中间语言
    AutoCAD ObjectARX和RealDWG资料
  • 原文地址:https://www.cnblogs.com/xieyuanzheng/p/5597073.html
Copyright © 2011-2022 走看看