zoukankan      html  css  js  c++  java
  • 【SQL SERVER】触发器(一)

      下面是个人对触发器知识的整理,触发器其实很简单,但想要编写发杂的触发器操作还是需要一定的SQL语句编写,触发器主要用于SQL SERVER约束、默认值和规则的完整性检查,还可以实现由主键和外键不能保证的参照完整性和数据的一致性。总之,触发器也是很重要的知识点。

    一、触发器的概念

      触发器是一种特殊类型的存储过程,它不同于一般存储过程。一般存储过程通过存储过程名直接被调用,而触发器则通过事件进行触发而执行。

    二、触发器的优点

      1、触发器是自动的执行的;

      2、触发器可以通过数据库的相关表进行层叠更改;

      3、触发器的可以执行比CHECK约束更为复杂的操作。可以书写比较复杂的SQL语句,比如引用多个表,使用流程结构;

      4、跟踪变化。触发器可以侦测数据库内的操作,比如表的数据更新,修改数据后的变化,如果不允许可以回滚修改操作;

      5、拒绝或回滚违反引用完整性的操作,检查对表的操作是否违反引用完整性,从而决定提交还是回滚操作。

    三、触发器的类型

      1、Alter触发器:就是在某一语句(INSERT UPDATE DELETE)执行之后激活触发器。且只能在表上定义,可以为针对表的同一操作定义多个触发器。可以定义哪一个触发器先执行。

      2、Instead Of触发器:就是在某一语句(INSERT UPDATE DELETE)执行之前激活触发器,但并不执行其定义的操作(INSERT UPDATE DELETE),而仅是执行触发器本身,同一操作只能定义一个Instead of触发器。

    四、创建触发器

    • Create Trigger必须是批处理的第一个语句;
    • 创建触发器的权限默认分配给表的所有者,且不能将该权限转给其他用户;
    • 触发器为数据库对象,其名称必须遵循标示符的命名规则;
    • 虽然触发器可以引用当前数据库之外的对象,但只能在当前数据库中创建触发器;
    • 虽然不能在临时表上货系统表上创建触发器,但是触发器可以引用临时表;
    • 在含有Delete或update操作定义之外的外键表中个,不能定义Instead Of和Instead Of Update触发器;
    • 虽然Truncate Table语句类似于没有Where字句的Delete语句,但她不会引发delete触发器,因为Truncate Table语句没有记录;
    • Writetext语句不会引发Insert或update触发器;
    • 当创建一个触发器时必须指定触发器名称,在哪一个表上定义触发器,触发器在何时激活,激活触发器的数据修改语句。

    1、每一个触发器都包含3个操作;触发器的名称,激活触发器的操作,触发器的执行操作。

       这里我们首先创建数据库和表;

    CREATE DATABASE pubs
    Use pubs
    EXEC dbo.sp_addtype @typename=N'tid', @phystype='varchar(6)', @nulltype='NOT NULL', @owner=N'dbo'
    EXEC dbo.sp_addtype @typename=N'id', @phystype='varchar(11)', @nulltype='NOT NULL', @owner=N'dbo'
    GO
    EXEC dbo.sp_addtype @typename=N'empid', @phystype='char(9)', @nulltype='NOT NULL', @owner=N'dbo'
    GO
    
    CREATE TABLE [authors](
        [au_id] [id]  NOT NULL,
        [au_lname] [varchar](40) NOT NULL,
        [au_fname] [varchar](20) NOT NULL,
        [phone] [char](12) NOT NULL,
        [address] [varchar](40) NULL,
        [city] [varchar](20) NULL,
        [state] [char](2) NULL,
        [zip] [char](5) NULL,
        [contract] [bit] NOT NULL
    ) ON [PRIMARY]
    
    CREATE TABLE [employee](
        [emp_id] [empid] NOT NULL,
        [fname] [varchar](20) NOT NULL,
    
        [minit] [char](1) NULL,
        [lname] [varchar](30) NOT NULL,
        [job_id] [smallint] NOT NULL,
        [job_lvl] [tinyint] NULL,
        [pub_id] [char](4) NOT NULL,
        [hire_date] [datetime] NOT NULL
    ) ON [PRIMARY]


    例1、在数据库pubs的authors表上创建3个触发器 

    Create Trigger Insert_trigger
    On authors Alter Insert
    AS
    Print'有新的人员被加入!'
    GO
    
    Create Trigger update_trigger
    On authors After update
    AS
    Print'有的人员被更新!'
    GO
    
    Create Trigger Insert_trigger
    On authors After delete
    AS
    Print'有的人员被删除!'
    GO

    如果有一些触发执行操作后,激活了触发器,但是并不希望触发操作都成功,我们可以在触发器的处理语句上进行回滚事务。

    Create Trigger Insert_trigger
    On authors After Delete
    AS
    if ‘Green’ in (Select au_lname from deleted)/*这里deleted是个逻辑表,我们下面会说到*/
    Begin 
    Print '该信息不允许删除'
    RollBack Transaction
    End
    GO

    上面都是一些基本的触发器知识,希望对你有帮助!

  • 相关阅读:
    request.getParameter() 和request.getAttribute() 区别
    Java中this和super的用法总结
    jQuery实现列表框双向选择操作
    Eclipse中.setting目录下文件介绍
    通过Ajax方式上传文件,使用FormData进行Ajax请求
    ASP.NET程序中常用的三十三种代码
    计算地球上两个坐标点(经度,纬度)之间距离sql函数
    动态调用WebService(C#) (非常实用)
    带SoapHeader验证的WebServices
    GridView内容详解(转载)
  • 原文地址:https://www.cnblogs.com/wywnet/p/3468783.html
Copyright © 2011-2022 走看看