返回顶部
首页 > 资讯 > 数据库 > SQL触发器的使用及语法
  • 181
分享到

SQL触发器的使用及语法

摘要

定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。常见的触发器有三种:分别应用于Insert , Update , Delete 事件。 我为


	SQL触发器的使用及语法
[数据库教程]

定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。
常见的触发器有三种:分别应用于Insert , Update , Delete 事件。

我为什么要使用触发器?比如,这么两个表:

Create Table Student( --学生表
StudentID int primary key, --学号
…
)

Create Table BorrowRecord( --学生借书记录表
BorrowRecord int identity(1,1), --流水号
StudentID int , --学号
BorrowDate datetime, --借出时间
ReturnDAte Datetime, --归还时间
…
)

用到的功能有:
1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);
2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。
等等。

这时候可以用到触发器。对于1,创建一个Update触发器:

Create Trigger truStudent
On Student --在Student表中创建触发器
for Update --为什么事件触发
As --事件触发后所要做的事情
if Update(StudentID)
begin

Update BorrowRecord
Set StudentID=i.StudentID
From BorrowRecord br , Deleted d ,Inserted i --Deleted和Inserted临时表
Where br.StudentID=d.StudentID

end

理解触发器里面的两个临时的表:Deleted , Inserted 。注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。
一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别是:
虚拟表Inserted 虚拟表Deleted

在表记录新增时 存放新增的记录 不存储记录
修改时 存放用来更新的新记录 存放更新前的记录
删除时 不存储记录 存放被删除的记录

一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted表,然后删除Student记录并写入新纪录。

对于2,创建一个Delete触发器

Create trigger trdStudent
On Student
for Delete
As
Delete BorrowRecord
From BorrowRecord br , Delted d
Where br.StudentID=d.StudentID

从这两个例子我们可以看到了触发器的关键:A.2个临时的表;B.触发机制。

sql触发器实例2

–触发器示例2

IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE XTYPE = ’TR’ AND NAME = ’T_INSERT_卷烟销售表’)
DROP TRIGGER T_INSERT_卷烟销售表
Go

CREATE TRIGGER T_INSERT_卷烟销售表
ON 卷烟销售表
FOR INSERT
AS
BEGIN TRANSACTioN
–检查数据的合法性:销售的卷烟是否有库存,或者库存是否大于零
IF NOT EXISTS (
SELECT 库存数量
FROM 卷烟库存表
WHERE 卷烟品牌 IN (SELECT 卷烟品牌 FROM INSERTED)
)
BEGIN
–返回错误提示
RaiSERROR(’错误!该卷烟不存在库存,不能销售。’,16,1)
–回滚事务
ROLLBACK
RETURN
END

IF EXISTS (
SELECT 库存数量
FROM 卷烟库存表
WHERE 卷烟品牌 IN (SELECT 卷烟品牌 FROM INSERTED) AND
库存数量 <= 0
)
BEGIN
–返回错误提示
RAISERROR(’错误!该卷烟库存小于等于0,不能销售。’,16,1)
–回滚事务
ROLLBACK
RETURN
END

-–对合法的数据进行处理

-–强制执行下列语句,保证业务规则

UPDATE 卷烟销售表
SET 销售金额 = 销售数量 * 销售单价
WHERE 卷烟品牌 IN (SELECT 卷烟品牌 FROM INSERTED)

DECLARE @卷烟品牌 VARCHAR(40)
SET @卷烟品牌 = (SELECT 卷烟品牌 FROM INSERTED)

DECLARE @销售数量 MONEY
SET @销售数量 = (SELECT 销售数量 FROM INSERTED)

UPDATE 卷烟库存表
SET 库存数量 = 库存数量 - @销售数量,
库存金额 = (库存数量 - @销售数量)*库存单价
WHERE 卷烟品牌 = @卷烟品牌
COMMIT TRANSACTION
GO

–-请大家自行跟踪[卷烟库存表]和[卷烟销售表]的数据变化。
–-针对[卷烟销售表],插入第一条测试数据,该数据是正常的。

INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)
SELECT ’红塔山新势力’,’某购货商’,10,12,1200
GO

–-针对[卷烟销售表],插入第二条测试数据,该数据 销售金额 不等于 销售单价 * 销售数量。
–-触发器将自动更正数据,使 销售金额 等于 销售单价 * 销售数量。

INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)
SELECT ’红塔山人为峰’,’某购货商’,10,22,2000
GO

–针对[卷烟销售表],插入第三条测试数据,该数据中的卷烟品牌在 卷烟库存表中找不到对应。
–触发器将报错。

INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)
SELECT ’红河V8’,’某购货商’,10,60,600
GO

–针对[卷烟销售表],插入第三条测试数据,该数据中的卷烟品牌在 卷烟库存表中库存为0。
–触发器将报错。

INSERT INTO 卷烟销售表(卷烟品牌,购货商,销售数量,销售单价,销售金额)
SELECT ’玉溪’,’某购货商’,10,30,300
GO


–查询数据
SELECT * FROM 卷烟库存表

SELECT * FROM 卷烟销售表
GO

–修改触发器 –实质上,是将 CREATE TRIGGER … 修改为 ALTER TRIGGER …即可。 –删除触发器 DROP TRIGGER xxx GO –删除测试环境 DROP TABLE 卷烟库存表 GO DROP TABLE 卷烟销售表 GO DROP TRIGGER T_INSERT_卷烟库存表 GO DROP TRIGGER T_INSERT_卷烟销售表 GO ################################################################## 触发器的基础知识和例子 :create trigger tr_name on table/view {for | after | instead of } [update][,][insert][,][delete] [with encryption] as {batch | if update (col_name) [{and|or} update (col_name)] } 说明: 1 tr_name :触发器名称 2 on table/view :触发器所作用的表。一个触发器只能作用于一个表 3 for 和after :同义 4 after 与instead of :sql 2000新增项目afrer 与 instead of 的区别 After 在触发事件发生以后才被激活,只可以建立在表上 Instead of 代替了相应的触发事件而被执行,既可以建立在表上也可以建立在视图上 5 insert、update、delete:激活触发器的三种操作,可以同时执行,也可选其一 6 if update (col_name):表明所作的操作对指定列是否有影响,有影响,则激活触发器。此外,因为delete 操作只对行有影响, 所以如果使用delete操作就不能用这条语句了(虽然使用也不出错,但是不能激活触发器,没意义)。 7 触发器执行时用到的两个特殊表:deleted ,inserted deleted 和inserted 可以说是一种特殊的临时表,是在进行激活触发器时由系统自动生成的,其结构与触发器作用的表结构是一 样的,只是存放 的数据有差异。 续 下面表格说明deleted 与inserted 数据的差异 deleted 与inserted 数据的差异 Inserted 存放进行insert和update 操作后的数据 Deleted 存放进行delete 和update操作前的数据 注意:update 操作相当于先进行delete 再进行insert ,所以在进行update操作时,修改前的数据拷贝一条到deleted 表中,修改后 的数据在存到触发器作用的表的同时,也同时生成一条拷贝到insered表中 / CREATE TRIGGER [TRIGGER admixture_receive_log] ON dbo.chl_lydj FOR UPDATE AS begin declare @djsfxg char(10) declare @wtbh char(20) select @wtbh=wtbh from inserted update ly_tzk set djsfxg=‘已修改’ where wtbh=@wtbh end if (select data_sfjl from t_logsetup)=‘是’ begin declare @oldcjmc char (100) declare @oldlyrq datetime declare @oldbzbh char (60) declare @oldzl char (20) declare @olddj char (10) declare @newcjmc char (100) declare @newlyrq datetime declare @newbzbh char (60) declare @newzl char (20) declare @newdj char (10)

  select @newcjmc=cjmc,@newlyrq=lyrq,@newbzbh=bzbh,@newzl=zl,@newdj=dj from inserted
  select @xgr=xgr from t_modifyuser where @wtbh=wtbh

  if @oldcjmc<>@newcjmc
  begin
  insert into t_modifylog (wtbh, mod_time, mod_table, mod_field, ori_value, now_value, mod_people) values
  (@wtbh,getdate(), ‘chl_lydj’,‘cjmc’, @oldcjmc, @newcjmc, @xgr)
  end

  end
  //修改时,直接把‘create’改为‘alter’即可

  /

  CREATE TRIGGER [TRIGGER ly_tzk_syf] ON dbo.ly_tzk
  FOR insert
  AS
  begin
  declare @clmc char(100) declare @dwbh char(100) declare @syf char(100) declare @dwGCbh char(100) declare @wtbh char(50)
  declare @dj_1 money declare @feiyong_z money declare @feiyong_xf money declare @feiyong_sy money
  declare @dj char(20)
  select @wtbh=wtbh , @clmc=clmc , @dwbh=dwbh ,@syf=syf from inserted
  select @dj=dj from feihao_bz where clmc=@clmc
  select @feiyong_z=feiyong_z, @feiyong_xf=feiyong_xf, @feiyong_sy=feiyong_sy from gongchengxinxi where dwgcbh=@dwbh

 set @dj_1=convert(money ,@dj)

  if @dj_1 <>0
  begin
  set @feiyong_xf=@feiyong_xf+@dj_1
  set @feiyong_sy=@feiyong_sy-@dj_1

  update ly_tzk set syf=@dj where wtbh=@wtbh
  update gongchengxinxi set feiyong_xf=@feiyong_xf, feiyong_sy=@feiyong_sy where dwgcbh=@dwbh
  end
  else update ly_tzk set syf=convert(char , 0.0) where wtbh=@wtbh

  end

  //

  CREATE TRIGGER [TRIGGER ly_tzk_syf_shanchu] ON dbo.ly_tzk
  FOR delete
  AS
  begin
  declare @clmc char(100) declare @dwbh char(100) declare @dwgcbh char(100) declare @wtbh char(50)
  declare @feiyong_z money declare @feiyong_xf money declare @feiyong_sy money
  declare @syf char(100) declare @syf_1 money
  –declare @dj char(20) declare @dj_1 money
  select @wtbh=wtbh , @clmc=clmc , @dwbh=dwbh ,@syf=syf from inserted
  –select @dj=dj from feihao_bz where clmc=@clmc
  select @feiyong_z=feiyong_z, @feiyong_xf=feiyong_xf, @feiyong_sy=feiyong_sy from gongchengxinxi where dwgcbh=@dwbh

    set @syf_1=convert(money ,@syf)

if @syf_1 <>0

  begin
  set @feiyong_xf=@feiyong_xf-@syf_1
  set @feiyong_sy=@feiyong_sy+@syf_1
  update gongchengxinxi set feiyong_xf=@feiyong_xf, feiyong_sy=@feiyong_sy where dwgcbh=@dwbh
  end
  end

  //

 

 

 

SQL触发器的使用及语法

原文地址:https://www.cnblogs.com/ReAiQingYi/p/14865738.html

您可能感兴趣的文档:

--结束END--

本文标题: SQL触发器的使用及语法

本文链接: https://lsjlt.com/news/8492.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SQL触发器的使用及语法
    定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。常见的触发器有三种:分别应用于Insert , Update , Delete 事件。 我为...
    99+
    2015-02-12
    SQL触发器的使用及语法 数据库入门 数据库基础教程 数据库 mysql
  • sql触发器的使用及语法
    触发器是一种数据库代码,在特定事件(插入、更新、删除)发生时自动执行。触发器的语法包含触发器名称、表名称和触发时机(before/after)以及事件类型(insert/update/d...
    99+
    2024-04-13
  • SQL触发器的功能和语法
    SQL触发器的使用及语法 引言:SQL触发器(Trigger)是一种特殊的存储过程,它会在数据库表发生特定操作时自动被触发执行。通过触发器,可以实现对表数据更新、插入和删除操作的自动化...
    99+
    2024-02-22
  • 触发器的概念及其语法/创建触发器/查看以及删除
    触发器可以简单理解一种特殊的存储过程,之前存储过程的变量定义及流程语句同样适合触发器,唯一不同的是我们只需要定义触发器,而不用手动调用触发器。从事件触发的角度来说,触发器编写的过程就是触发事件定义的过程,因为触发器定义好后会随着数据库操作命...
    99+
    2021-11-25
    触发器的概念及其语法/创建触发器/查看以及删除
  • 怎么使用sql触发器
    本篇文章给大家分享的是有关怎么使用sql触发器,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。  sql中的触发器是对某个表进行操作时...
    99+
    2024-04-02
  • sql触发器如何使用
    这篇文章给大家分享的是有关sql触发器如何使用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。  sql中的触发器是对某个表进行操作时而触发的某种条件,可以用CREATE语句创建触...
    99+
    2024-04-02
  • sql触发器的使用有哪些
    SQL触发器是数据库中的一种特殊对象,它们可以在数据库中的某个特定事件发生时自动执行一系列的操作。以下是SQL触发器的一些常见使用场...
    99+
    2023-10-25
    sql
  • SQL触发器的应用
    SQL触发器的作用及具体代码示例 概述:SQL触发器是一种特殊的存储过程,它是在数据库中的数据发生变化时自动执行的一段代码。触发器可以在插入(INSERT)、更新(UPDATE...
    99+
    2024-02-22
    sql 触发器 作用
  • SQL触发器定义与使用
    目录触发器简介触发器的创建及调用触发器的分类及执行顺序触发器的删除触发器的优缺点比如:现需要向学生表中插入新的学生数据。但在插入学生数据的时,需要同时检查老师表里的数据。如果插入学生的老师不在老师表里,则先向老师表中插入...
    99+
    2023-01-05
    SQL触发器 SQL触发器使用 SQL触发器定义
  • SQL SERVER触发器怎么使用
    SQL Server触发器可以在数据库中的表上定义,当满足特定条件时,触发器会自动执行一些操作。以下是使用SQL Server触发器...
    99+
    2023-08-18
    SQL SERVER
  • 【MySQL触发器】触发器的使用、创建、修改及删除
    目录 一、什么是触发器 二、创建触发器 ①创建一个insert事件触发器 ②创建一个delete 事件触发器  三、触发器包含多条执行语句 四、查看触发器  ①SHOW TRIGGERS语句查看触发器 ②查看系统表triggers实现查看触...
    99+
    2023-09-17
    mysql 数据库 sql database
  • SQL SERVER中各类触发器的完整语法及参数是什么
    这篇文章给大家介绍SQL SERVER中各类触发器的完整语法及参数是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。语法:Trigger on an I...
    99+
    2024-04-02
  • Mysql中的触发器定义及语法介绍
    目录1.定义:2.语法:3.删除触发器4.查询触发器5.触发器类型OLD和NEW的使用1.定义:   触发器和存储过程相似,都是嵌入到 mysql 中的一段程序。触发器是由事件来触发某个操作。当数据库执行这些事件时,就会...
    99+
    2022-06-23
    mysql触发器
  • Sql Server中如何使用触发器
    本篇文章为大家展示了Sql Server中如何使用触发器,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Sql Server为每个触发器都创建了两个专用表:Inser...
    99+
    2024-04-02
  • sql触发器的三种触发方式
    sql 触发器的触发方式有:before:在数据修改前触发,用于强制业务规则。after insert:在插入新行后触发,用于向其他表添加或更新数据。after update:在更新现有...
    99+
    2024-04-13
  • mysql 触发器的使用及注意点
    目录前言一、触发器简介二、触发器特点及使用场景1、增强数据库的安全性2、实现数据库操作的日志审计3、实现复杂的级联操作三、触发器类似与核心参数四、触发器语法1、创建语法2、查看触发器...
    99+
    2022-11-13
    mysql 触发器使用 mysql 触发器
  • 使用mysql触发器的方法
    这篇文章主要讲解了使用mysql触发器的方法,内容清晰明了,对此有兴趣的小伙伴可以学习一下,相信大家阅读完之后会有帮助。什么是触发器:触发器用来在某些操作之后,“自动”执行一些操作。(比如插入了新的学生信息...
    99+
    2024-04-02
  • mysql触发器的使用方法
    本篇内容主要讲解“mysql触发器的使用方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql触发器的使用方法”吧!说明触发器可以帮助应用于数据库,以确保数据的完整性、日志记录、数据验证等...
    99+
    2023-06-20
  • SQL触发器之常用语句有哪些
    这篇文章给大家分享的是有关SQL触发器之常用语句有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、创建一个简单的触发器CREATE TRIGGER 触发...
    99+
    2024-04-02
  • sql触发器怎么用
    sql 触发器是数据库对象,用于在特定事件(插入、更新、删除)发生时执行一系列动作。其用途包括:强制执行业务规则自动执行任务实现级联更新或删除审计数据更改 SQL 触发器的用途 SQL...
    99+
    2024-05-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作