加入收藏 | 设为首页 | 会员中心 | 我要投稿 海洋资讯信息网 (https://www.haijunwang.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQL SERVER 触发器

发布时间:2022-10-29 16:30:58 所属栏目:MsSql教程 来源:
导读:  语法

  CREATE TRIGGER trigger_name -- 触发器名称必须符合标识符规则,并且在数据库中必须唯一。可以选择是否指定触发器所有者名称。
  ON { table | view } -- 可以选择是否指定表或视图的所有者名
  语法
 
  CREATE TRIGGER trigger_name  -- 触发器名称必须符合标识符规则,并且在数据库中必须唯一。可以选择是否指定触发器所有者名称。
  ON { table | view }  -- 可以选择是否指定表或视图的所有者名称。
  [ WITH ENCRYPTION ]  -- 加密触发器
  {
        --for=after, 不能在视图上定义 AFTER 触发器。
       --INSTEAD OF指定执行触发器而不是执行触发 SQL 语句,从而替代引起触发器sql语句的操作。
      { { FOR | AFTER | INSTEAD OF } { [ INSERT ][ , ] [DELETE]  [ , ] [ UPDATE ] }
          [ WITH APPEND ]     -- 指定应该添加现有类型的其它触发器
          [ NOT FOR REPLICATION ]  --当复制进程更改触发器所涉及的表时,不应执行该触发器。
          AS          -- 触发器要执行的操作
          [ { IF UPDATE ( column )
              [ { AND | OR } UPDATE ( column ) ]
                  [ n ]
            -- bitwise_operator 是用于比较运算的位运算符
          | IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
                  { comparison_operator } column_bitmask [ n ]
          } ]
          sql_statement [ n ]
      }
  }
  复制代码
  注:{}表示必须选择内部一值,[ ]表示可选字段
 
  INSTEAD OF:在表或视图上,每个 INSERT、UPDATE 或 DELETE 语句最多可以定义一个 INSTEAD OF 触发器。
 
  然而Mssq触发器,可以在每个具有 INSTEAD OF 触发器的视图上定义视图。INSTEAD OF 触发器不能在 WITH CHECK OPTION 的可更新视图上定义。如果向指定了 WITH CHECK OPTION 选项的可更新视图添加 INSTEAD OF 触发器,SQL Server 将产生一个错误。用户必须用 ALTER VIEW 删除该选项后才能定义 INSTEAD OF 触发器。
 
  IF (COLUMNS_UPDATED()):测试是否插入或更新了提及的列,仅用于 INSERT 或 UPDATE 触发器中。
 
  COLUMNS_UPDATED 返回varbinary 位模式,表示插入或更新了表中的哪些列。COLUMNS_UPDATED 函数以从左到右的顺序返回位,最左边的为最不重要的位。最左边的位表示表中的第一列;向右的下一位表示第二列,依此类推。
 
  如果在表上创建的触发器包含 8 列以上,则 COLUMNS_UPDATED 返回多个字节,最左边的为最不重要的字节。在 INSERT 操作中 COLUMNS_UPDATED 将对所有列返回 TRUE 值,因为这些列插入了显式值或隐性 (NULL) 值。可以在触发器主体中的任意位置使用 COLUMNS_UPDATED。
 
  触发器特性触发器可以包含任意数量和种类的 Transact-SQL语句触发器旨在根据数据修改语句检查或更改数据它不应将数据返回给用户
 
  理解触发器里的两个临时表:Deleted , Inserted
 
  注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。
 
  在触发器中可加入事务处理
 
  CREATE TRIGGER triggerName
  ON tableName
  FOR INSERT ,UPDATE
  AS
  --提交事务处理
  BEGIN
  TRANSACTION
  --检查合法性
  相机软触发和硬触发_jk触发分相器_Mssq触发器
 
 
  --检查数据的合法性:销售的卷烟是否有库存,或者库存是否大于零
             IF NOT EXISTS ()
             BEGIN
                 --返回错误提示
                 RAISERROR('错误信息' ,16, 1)
                 --回滚事务
                 ROLLBACK
                 RETURN
             END
  --检查完成,若正常则往下处理
  --正常,trigger code
  COMMIT TRANSACTION
  end
  复制代码
  实例
 
  建立表jor(mnum ,mname ,inum ) student(sid ,sex ,major ,schoolYear )
 
  其中,student 的 sid 列包含 jor.mnum 列的信息
 
  目的:在插入student 的 sid 列时,根据 sid 信息自动查询jor表的munm,将 mname自动插入student.major
 
  --jor表
  CREATE TABLE jor
  (
      mnum char (3)   PRIMARY KEY ,
      mname varchar (48) NOT NULL,
      inum  varchar (2) NOT NULL
  )
  --插入数据
  INSERT INTO jor VALUES ('004' ,'经济专业','11' )
  INSERT INTO jor VALUES ('005' ,'机电专业','12' )
  INSERT INTO jor VALUES ('006' ,'英语专业','12' )
  select  * from jor;
  --student表
  drop table student
  CREATE TABLE student
  (
      sid varchar (10) PRIMARY KEY ,
      sex  as convert( bit,substring (sid, 2,1 ))persisted not NULL, --DEFAULT '0' 0:man,1:woman;
  Mssq触发器_相机软触发和硬触发_jk触发分相器
 
 
      major varchar (48),
      paperStatus  char (1) NOT NULL CHECK (paperstatus in('1', '2','3' ,'4') ) DEFAULT '1' ,--1:未选题,2:审核中,3重新选题,4已选题
      schoolYear as convert( char(2 ),substring( sid,3 ,2)) persisted not NULL
  )
  select  * from student
  --使用test数据库
  USE test
  GO
  --已存在trigger则先删除再创建
  IF EXISTS(
    SELECT *
      FROM sys .triggers
     WHERE name = N'studenttrigger'
       AND parent_class_desc = N'test'
  )
      DROP TRIGGER studenttrigger ON DATABASE
  GO
  --创建
  CREATE TRIGGER studenttrigger
  ON student
  FOR INSERT ,UPDATE
  AS if update (sid) --更新sid列,sid列为主键,不可更新,update无意义
  BEGIN
      declare @sid char( 10)   --声明变量
      select @sid =sid from inserted --inserted表示新表变量
      update  student set major=(select mname from test .dbo. jor where mnum in (Select SUBSTRING( @sid,5 ,3))) where sid=@sid
  end
  --测试
  INSERT INTO student( sid) VALUES ('123456789' )
  INSERT INTO student( sid) VALUES ('2512006770' )
  update student set sid= '2512005770' where sid= '2512006770'--sid列为主键,不可更新
  delete student where sid= '2512006770'
  select  * from student
  复制代码
 

(编辑:海洋资讯信息网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!