SqlServer触发器的原理及案例

合集下载

整理的关于SQL Server中事务,触发器和存储过程的介绍以及实际例子

整理的关于SQL Server中事务,触发器和存储过程的介绍以及实际例子

事务事务(Transaction)是并发控制的单位,是用户定义的一个操作序列。

这些操作要么都做,要么都不做,是一个不可分割的工作单位。

通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。

(2):事务通常是以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。

COMMIT表示提交,即提交事务的所有操作。

具体地说就是将事务中所有对数据库的更新写回到磁盘上的物理数据库中去,事务正常结束。

ROLLBACK表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库的所有以完成的操作全部撤消,滚回到事务开始的状态。

(3):事务运行的三种模式:A:自动提交事务每条单独的语句都是一个事务。

每个语句后都隐含一个COMMIT。

B:显式事务以BEGIN TRANSACTION显式开始,以COMMIT或ROLLBACK显式结束。

C:隐性事务在前一个事务完成时,新事务隐式启动,但每个事务仍以COMMIT或ROLLBACK显式结束。

(4):事务的特性(ACID特性)A:原子性(Atomicity)事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。

B:一致性(Consistency)事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。

一致性与原子性是密切相关的。

C:隔离性(Isolation)一个事务的执行不能被其他事务干扰。

D:持续性/永久性(Durability)一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。

注:事务是恢复和并发控制的基本单位。

数据库事务的ACID属性原子性(atomic)(atomicity)事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。

通常,与某个事务关联的操作具有共同的目标,并且是相互依赖的。

如果系统只执行这些操作的一个子集,则可能会破坏事务的总体目标。

sqlserver中数据增删改 触发器写法

sqlserver中数据增删改 触发器写法

SQL Server是一种关系型数据库管理系统,用于在计算机和服务器上存储和检索数据。

在SQL Server中,数据的增删改操作是非常常见的,而触发器则是一种在数据库中定义的特殊的存储过程,它可以在数据被修改时自动执行。

本文将介绍SQL Server中数据增删改触发器的写法并提供实例演示。

一、触发器的基本概念1.1 触发器定义触发器是一种与表相关的数据库对象,它会在表上插入、更新或删除数据时自动执行。

1.2 触发器分类在SQL Server中,触发器分为INSERT触发器、UPDATE触发器和DELETE触发器,分别表示在数据插入、更新和删除操作时触发执行。

二、触发器的创建与使用2.1 创建触发器在SQL Server中,可以使用CREATE TRIGGER语句创建一个触发器,语法如下:```sqlCREATE TRIGGER trigger_nameON table_nameAFTER INSERT, UPDATE, DELETEASBEGIN-- 触发器执行的逻辑END```2.2 触发器的执行时机在创建触发器时,需要指定触发器执行的时机,包括AFTER和INSTEAD OF两种选项。

AFTER表示在数据操作之后执行触发器逻辑,而INSTEAD OF表示在数据操作之前执行触发器逻辑。

2.3 触发器的使用一旦创建了触发器,它会在指定的操作发生时自动执行,无需手动调用触发器。

三、触发器的编写实例下面我们以一个实际的案例,演示如何在SQL Server中编写数据增删改触发器。

3.1 创建测试表我们创建一个测试表TestTable,用于存储测试数据,表结构如下:```sqlCREATE TABLE TestTable(ID INT PRIMARY KEY,Name NVARCHAR(50))```3.2 创建INSERT触发器接下来,我们创建一个INSERT触发器,当往TestTable表中插入数据时,自动将数据插入到另一个备份表BackupTable中。

sqlserver数据库触发器的工作原理

sqlserver数据库触发器的工作原理

SQL Server数据库触发器是一种特殊类型的存储过程,它可以在数据库中的特定事件发生时自动执行。

触发器可以用于监视数据的变化并采取相应的操作,例如插入、更新或删除数据时触发某些业务逻辑。

本文将深入探讨SQL Server数据库触发器的工作原理,包括触发器的类型、创建和使用方法,以及一些最佳实践。

一、触发器的类型SQL Server中有两种类型的触发器:DML触发器和DDL触发器。

1. DML触发器DML触发器(Data Manipulation Language Trigger)是针对数据操作事件的触发器,包括INSERT、UPDATE和DELETE。

当这些事件发生时,DML触发器可以在受影响的表上自动执行相应的逻辑。

DML 触发器可以分为AFTER触发器和INSTEAD OF触发器。

- AFTER触发器:AFTER触发器在数据操作事件完成后触发,可以用于记录日志、更新其他相关表等操作。

- INSTEAD OF触发器:INSTEAD OF触发器可以代替原始的数据操作事件,允许用户在数据操作前执行自定义的逻辑,常用于数据验证和转换。

2. DDL触发器DDL触发器(Data Definition Language Trigger)用于监视数据库结构的变化,包括CREATE、ALTER和DROP等DDL语句的执行。

DDL触发器可以在这些数据库结构变化发生时执行相应的逻辑,如记录变更、阻止某些操作等。

二、触发器的创建和使用要创建触发器,首先需要使用CREATE TRIGGER语句定义并命名一个新触发器,然后指定触发器在哪些事件上触发,以及触发时执行的逻辑。

触发器逻辑通常是一段T-SQL代码,可以包含查询、条件判断、事务控制等操作。

1. 创建DML触发器要创建DML触发器,可以使用如下语法:```CREATE TRIGGER trigger_nameON table_nameAFTER/INSTEAD OF INSERT/UPDATE/DELETEASBEGIN-- trigger logicEND```在这个语法中,trigger_name是触发器的名称,table_name是触发器所在的表,AFTER/INSTEAD OF INSERT/UPDATE/DELETE指定触发的事件,BEGIN和END之间是触发器的逻辑代码。

sqlserver触发器例题

sqlserver触发器例题

sqlserver触发器例题SQL Server 触发器是一种数据库对象,它可以在特定表上的数据发生更改时自动执行一系列操作。

触发器可以用于实现业务规则和数据完整性约束,以及跟踪数据变化等功能。

在本文中,我们将介绍两个 SQL Server 触发器的例题及其解决方案。

例题一:在一张名为"Employee"的表上创建一个触发器,以便在插入新员工记录时自动将当前日期作为"hire_date"字段的默认值。

解决方案:首先,我们需要使用下面的 SQL 命令创建一个名为"Employee"的表,并在该表中添加一个"hire_date"字段:```sql CREATE TABLE Employee ( employee_id INT PRIMARY KEY, employee_name VARCHAR(50), hire_date DATE ) ```接下来,我们可以使用下面的 SQL 命令创建一个名为"trg_Employee_Insert"的触发器:```sql CREATE TRIGGER trg_Employee_Insert ON Employee FOR INSERT AS BEGIN UPDATE Employee SET hire_date = GETDATE() WHERE employee_id IN (SELECT employee_id FROM inserted) END ```在这个触发器中,我们使用了"FOR INSERT"来指定触发器在插入操作之后执行。

然后,我们使用了"GETDATE()"函数来获取当前日期,并将其更新到"hire_date"字段中。

现在,当我们向"Employee"表中插入一条新的员工记录时,触发器将自动将当前日期作为"hire_date"字段的默认值:```sql INSERT INTO Employee (employee_id, employee_name) VALUES (1, 'John') ```例题二:在一张名为"Orders"的表上创建一个触发器,以便在删除订单记录时自动将相应的产品库存加回去。

SQLSERVER课件触发器

SQLSERVER课件触发器
9
Insert 触发器
当试图向表中插入数据时,将执行Insert触 发器
Insert 触发器执行下列操作:
向Inserted表中插入一个新行的副本 检查Inserted表中的新行,确定是否要阻止该插
入操作。 如果所插入的行中的值是有效的,则将该行插
入到触发器表中。
10
Insert 触发器示例
Sp_configure ‘nested trigger’,1
要禁用触发器嵌套,请执行下面的语句:
Sp_configure ‘nested trigger’,0
21
触发器与性能
由触发器引起的开销通常较低。 大部分时间花费在引用逻辑表以外的其它表上。 Deleted和Inserted逻辑表始终位于内存中。
15
DELETE触发器示例
16
不能在触发器中使用的语句
17
INSTEAD OF 触发器
包含代替原始数据操作语句的代码 主要优点是可以使不能更新的视图支持更新 另外,可以拒绝批处理中的某系部分同事允许批
处理的其它部分成功
18
视图的INSTEAD OF触发器示例
19
级联触发器
级联触发器用于强制引用的完整性 当某个表发生修改时,级联触发器会修改
的更新
12
列级UPDATE触发器
13表级UPDATE触发器示例源自14DELETE触发器
当试图从表中删除数据时,将执行DELETE 触发器
DELETE触发器执行下列操作:
从触发器表中删除行。 将删除的行插入到Deleted表中。 检查Deleted表中的行,以确定是否需要或应如
何执行触发器操作。
3
触发器触发示例
员工表
退休员工表

SQLSERVER触发器(附有实例)

SQLSERVER触发器(附有实例)

SQLSERVER触发器(附有实例)触发器:即当发⽣某⼀事件时,如果满⾜给定条件,则执⾏相应的动作。

它的基本架构:触发器创建语法:(1)CREATETRIGGER trigger_nameON table|viewFOR|AFTER|INSTEADOF [DELETE][,INSERT][,UPDATE]ASSql_statement[…n](2)CREATETRIGGER trigger_nameON table|viewFOR|AFTER|INSTEADOF [DELETE][,INSERT][,UPDATE]ASIFUPDATE(column)[{AND|OR}UPDATE(COLUMN)][…]IF(COLUMNS_UPDATED())Sql_statement[…n]注:(不同数据库⽀持不同的类型触发器,有些还⽀持before类型触发器,像SQL server 就不⽀持before触发器)SQL Server⽀持两种类型的触发器AFTER触发器和INSTEAD OF 触发器,其中、AFTER触发器要求只有执⾏某⼀操作ISERT, UPDATE ,DELETE之后触发器才被触发。

1)INSTEAD OF 触发器表⽰并不执⾏其所定义的操作INSERT,UPDATE ,DELETE,⽽仅是执⾏触发器本⾝,既可在表上定义INSTEAD OF 触发器,也可以在视图上定义INSTEAD OF 触发器。

2)after 触发器(也叫“FOR”触发器)则会在触发 insert、update 或是delect 动作之后执⾏。

触发事件分为三类:UPDATE、DELETE和INSERT。

另外,定义触发器时,系统都都会⾃动⽣成两张表,我们是可以直接⽤的,如下:如下是实例(都是亲⼿实践过的):1.在表Student中建⽴删除触发器,实现表Student和表SC的级联删除,也就是只要删除表Student中的元组学号为s1,则表SC中SNO为s1的元组也要删除;建⽴完触发器后⽤企业管理器删除Student中学号为30的元组,看看表SC中SNO为30的选课记录是否也⼀起删除;create trigger t_std2 on studentinstead of deleteasbegindeclare @id char(5)select @id=sno from deleteddelete from sc where SNo =@iddelete from student where SNo=@idendgodelete from Student where SNo='00002'/*2. 在表Course中增加⼀个职业规划选修课,为(005,职业规划,4,0014),在表SC中建⽴⼀个触发器,实现规定年龄24岁以上(包括24岁)的学⽣才能选修职业规划这门课程,如果年龄⼩于24岁,则输出’年龄⼩于24,不能选修该门课程’,插⼊失败,⽤SQL语句在SC表中分别插⼊(‘00001’,’005’,null)和(‘00005’,’005’,null)看看结果;**/create trigger t_sc on scfor insertasbegindeclare @id char(5)select @id=sno from insertedif((select cno from inserted)='005' and (select sage from student where SNo= @id )<24)beginprint '年龄⼩于24,不能选修该门课程 'rollback transactionendelseprint 'nice!'endinsert into course values('005','职业规划','4','0014')insert into sc values('00001','005',null)insert into sc values('00005','005',null)select * from scgo3.在表SC中建⽴更改触发器,实现表SC中的修改后的成绩不能低于修改前的成绩,如果修改后的成绩低于修改前的成绩,则输出’修改后的成绩⽐修改前低,不能修改’,修改失败,⽤SQL语句把学号为00001,课程号为001的成绩分别改为90和70,看看结果;createtrigger t2_sc on scafter updateasif(update(score))begindeclare @score1 numeric(3,1),@score2numeric(3,1)select @score1=score from insertedselect @score2=score from deletedif(@score1>@score2 )print 'nice! 'elseupdate scset sc.Score=@score2 from sc,deletedwhere sc.SNo=deleted.SNo o=oprint '失败'endupdate scsetScore=70 where SNo='00001' and CNo='001'4. 在表Teacher中创建触发器,实现如果更新了表Teacher中的年龄和⼯资,则输出’更新了年龄和⼯资’,如果更新了年龄没有更新⼯资,则输出’更新了年龄’,如果更新了⼯资⽽没有更新年龄,则输出’更新了⼯资’,创建完后使⽤SQL语句把tno为001的年龄加1,把tno为002的⼯资加1,把tno为003的年龄和⼯资都加1,看看结果;create trigger t_teacher on teacherafter updateasbegindeclare @age int,@sal floatselect @age=age from deletedselect @sal=sal from deletedif(@age <> (select age from inserted )and @sal <>(select sal from inserted))print '更新了年龄和⼯资 'else if(@age <> (select age from inserted )and @sal =(select sal from inserted))print '更新了⼯资 'else if(@age = (select age from inserted )and @sal <>(select sal from inserted))print '更新了年龄 'endupdate Teacherset age=age+1 where Tno='0001'**//**5. 在不删除触发器的前提下,使3创建的触发器⽆效;alter table teacher disable trigger t_teacher**//**6. 创建⼀个名为tri_Delete_C的触发器,要求⾸先判断数据库中是否已经存在名为tri_Delete_C的触发器,如果存在,⾸先删除,再创建,触发器要求删除⼀门课程时候,⾸先判断该课程有否有⼈选,如果有⼈选,则不能删除,并通过测试数据验证该触发器的执⾏情况。

SQLServer2000编程之触发器

SQLServer2000编程之触发器

李四
1000 0002 20001
检查deleted和inserted表中的数据,确定是 否需要回滚或执行其他操作
UPDATE触发器示例
问题:
跟踪用户的交易,交易金额超过20000元,则取消交易,并 给出错误提示。
分析:
在bank表上创建UPDATE触发器 修改前的数据可以从deleted表中获取 修改后的数据可以从inserted表中获取
inserted 和deleted 表
修改操作
inserted表 deleted表
增加 (INSERT)记 录
存放新增的记 录
------
删除 (DELETE)记 录
-----
存放被删除的 记录
修 (U改PDATinEs)e记rted表存 记和放录d更ele新te后d表的存放存记的放录信更息 新前的
从deleted表中 获取被删除的
交易记录
IF NOT EXISTS(SELECT * FROM sysobjects
WHERE name='backupTable')
SELECT * INTO backupTable FROM deleted
ELSE
INSERT INTO backupTable
SELECT * FROM deleted
帐户信息表bank
张三开户1000元, 李四开户1元
张三取钱200
问题:
交易信息表transInfo
没有自动修改张三的余额
最优的解决方案就是采用触发器:
它是一种特殊的存储过程
也具备事务的功能
它能在多表之间执行特殊的业务规则
1.什么是触发器
赵二退休 删除
员工表

实验 11.1 创建触发器_数据库系统原理及应用(SQL Server 2012)_[共4页]

实验 11.1 创建触发器_数据库系统原理及应用(SQL Server 2012)_[共4页]

242④触发器能够找出某一表在数据修改前后状态发生的差异,并根据这种差异执行一定的处理。

触发器只要满足触发条件即可执行,及时性很强,但其缺点是性能不够高。

4.触发器工作原理SQL Server在工作时为每个触发器在服务器的内存上建立两个特殊的表:Inserted和Deleted。

(1)Inserted表的功能若在某张表上创建触发器,触发条件为该表插入数据,则一旦对该表执行了插入(INSERT)操作,那么对该表插入的行都有一个相应的副本存放到Inserted表中,即Inserted表用来存储原表插入的内容。

(2)Deleted表的功能若在某张表上创建触发器,触发条件为该表删除数据,则一旦对该表执行了删除(DELETE)操作,则将删除的行存放至Deleted表中。

若在某张表上创建触发器触发条件为该表更新数据,则一旦对该表执行了更新(VPDATE)操作,则将更新前的数据存放至Deleted表中,更新后的数据存放至Inserted表。

Inserted表和Deleted 表只存在于触发器执行过程中。

5.创建触发器的SQL语句CREATE TRIGGER 触发器名称ON 表名 | 视图名[ WITH ENCRYPTION ] --加密触发器AFTER | INSTEAD OF INSERT [ ,UPDATE ] [ ,DELETE ]ASBEGIN<触发器要实现的T-SQL语句块>END6.修改触发器的SQL语句ALTER TRIGGER trigger_nameON(table | view)[ WITH ENCRYPTION ]{ { FOR | AFTER | INSTEAD OF { [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }[ NOT FOR REPLICATION ]AS7.删除触发器的SQL语句DROP TRIGGER 触发器名删除触发器所在的表时,SQL Server将自动删除与该表相关的触发器。

SqlServer基础之(触发器)

SqlServer基础之(触发器)

SqlServer基础之(触发器)阅读⽬录概念: 触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的⼀种⽅法,它是与表事件相关的特殊的存储过程,它的执⾏不是由程序调⽤,也不是⼿⼯启动,⽽是由事件来触发,当对⼀个表进⾏操作( insert,delete, update)时就会激活它执⾏。

触发器经常⽤于加强数据的完整性约束和业务规则等。

触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。

触发器和存储过程的区别: 触发器与存储过程的区别是运⾏⽅式的不同,触发器不能执⾏EXECUTE语句调⽤,⽽是在⽤户执⾏Transact-SQL语句时⾃动触发执⾏⽽存储过程需要⽤户,应⽤程序或者触发器来显⽰地调⽤并执⾏。

⼀:触发器的优点 1.触发器是⾃动的。

当对表中的数据做了任何修改之后⽴即被激活。

 2.触发器可以通过数据库中的相关表进⾏层叠修改。

 3.触发器可以强制限制。

这些限制⽐⽤CHECK约束所定义的更复杂。

与CHECK约束不同的是,触发器可以引⽤其他表中的列。

⼆:触发器的作⽤ 触发器的主要作⽤就是其能够实现由主键和外键所不能保证的复杂参照完整性和数据的⼀致性,它能够对数据库中的相关表进⾏级联修改,提⾼⽐CHECK约束更复杂的的数据完整性,并⾃定义错误消息。

触发器的主要作⽤主要有以下接个⽅⾯:1. 强制数据库间的引⽤完整性2. 级联修改数据库中所有相关的表,⾃动触发其它与之相关的操作3. 跟踪变化,撤销或回滚违法操作,防⽌⾮法修改数据4. 返回⾃定义的错误消息,约束⽆法返回信息,⽽触发器可以5. 触发器可以调⽤更多的存储过程三:触发器的分类 SqlServer包括三种常规类型的触发器:DML触发器、DDL触发器和登录触发器。

1.DML(数据操作语⾔,Data Manipulation Language)触发器 DML触发器是⼀些附加在特定表或视图上的操作代码,当数据库服务器中发⽣数据操作语⾔事件时执⾏这些操作。

实验6 SQL Server触发器

实验6 SQL Server触发器

课程数据库原理及应用_ 实验名称 SQL Server触发器教师审批签字一.实验目的1、理解触发器的作用和工作机制;2、熟练掌握后触发器和替代触发器的区别;3、熟练掌握后触发器和替代触发器的创建。

二.实验内容及要求对CPXS数据库,完成如下任务:1、插入后触发器的设计和触发在产品销售表建立触发器,进行插入操作,保证产品编号与产品表中的对应字段一致,客户编号与客户表中对应字段一致,保证销售表中主键不能重复。

设计触发器的程序流程,注意给出适当的提示信息。

激发触发器(提示,可以先取消主键和外键约束)。

2、删除后出发期的设计和触发在客户表建立触发器,进行删除操作,保证删除客户记录时,查询销售表中相应的记录,如果销售表中没有相应客户的信息,才允许删除。

设计触发器的程序流程,注意给出适当的提示信息。

激发触发器(提示,可以先取消外键约束)。

3、用约束实现触发器对于内容1的功能,单纯使用约束进行实现。

对于内容2,设计约束,实现删除客户记录的同时,级联删除销售表中相应的记录。

4、设计替代类型触发器,通过视图更新多张表。

创建销售视图,包含字段(产品编号,产品名称, 客户编号,客户名称, 销售日期,数量,销售额)。

对视图设计更新操作的替代触发器,更新视图的同时,更新产品、客户、销售三张表。

三.实验过程及结果(实验结果可以是运行画面的抓屏,抓屏图片要尽可能的小。

)1.USE CPXSGOCREATE TRIGGER tri_inserton销售for insertasbegindeclare @cpnum char(6)set @cpnum=(select inserted.产品编号from inserted)declare @cmnum char(6)set @cmnum=(select inserted.客户编号from inserted)if(@cpnum not in(select产品编号from产品))beginprint'插入数据中产品编号和产品表中的不一致,插入失败'print @cpnumrollbackendelse if(@cmnum not in(select客户编号from客户))beginprint'插入数据中客户编号和客户表中的不一致,插入失败'print @cmnumrollbackendelseprint'插入成功!'end验证:insert into销售values('s00002','c0002','2001.02.24',45,33333)2.USE CPXSGOCREATE TRIGGER Tri_Cus_Delon客户for deleteasbegindeclare @cmnum char(6)set @cmnum=(select deleted.客户编号from deleted)if(@cmnum is null)beginprint'该客户不存在,删除失败'endelse if(@cmnum in(select客户编号from销售))beginprint'销售表中存在该用户的记录,删除失败'print'客户编号为'+@cmnumrollbackendelseprint'删除成功'+'客户编号为:'+@cmnumend验证:delete from客户where客户编号='c00001'3.(1)USE CPXSGOCREATE TRIGGER tri_inserton销售for insertasbegindeclare @cpnum char(6)set @cpnum=(select inserted.产品编号from inserted)declare @cmnum char(6)set @cmnum=(select inserted.客户编号from inserted)if(@cpnum not in(select产品编号from产品))beginprint'插入数据中产品编号和产品表中的不一致,插入失败'print @cpnumrollbackendelse if(@cmnum not in(select客户编号from客户))beginprint'插入数据中客户编号和客户表中的不一致,插入失败'print @cmnumrollbackendelseprint'插入成功!'end验证:insert into销售values('s00002','c0002','2001.02.24',45,33333)(2)USE CPXSGOCREATE TRIGGER tri_reson客户for insert,deleteasbegindeclare @cmnum char(6)set @cmnum=(select deleted.客户编号from deleted)if(@cmnum is null)beginprint'该客户不存在,删除失败'endelse if(@cmnum in(select客户编号from销售))beginprint'销售表中存在该用户的记录,级联删除销售表中数据'print'客户编号为'+@cmnumdelete from销售where客户编号=@cmnumendelseprint'删除成功'+'客户编号为:'+@cmnumend验证:delete from客户where客户编号='c00001'select*from客户select*from销售4.USE CPXSGOCREATE VIEW view_sellASSELECT A.产品编号,A.产品名称,B.客户编号,B.客户名称,C.销售日期,C.数量,c.销售额FROM dbo.产品 A,dbo.客户 B,dbo.销售 CWHERE A.产品编号=C.产品编号AND B.客户编号=C.客户编号create trigger tri_tidaion view_sellinstead of updateasSET NOCOUNT ONdeclare @cp_num_in char(6)set @cp_num_in=(select inserted.产品编号from inserted)declare @cp_num_del char(6)set @cp_num_del=(select deleted.产品编号from deleted)declare @cp_name_in varchar(30)set @cp_name_in=(select inserted.产品名称from inserted)declare @cp_name_del varchar(30)set @cp_name_del=(select deleted.产品名称from deleted)declare @cm_num_in char(6)set @cm_num_in=(select inserted.客户编号from inserted)declare @cm_num_del char(6)set @cm_num_del=(select deleted.客户编号from deleted)declare @cm_name_in varchar(30)set @cm_name_in=(select inserted.客户名称from inserted)declare @cm_name_del varchar(30)set @cm_name_del=(select deleted.客户名称from deleted)declare @date datetimeset @date=(select inserted.销售日期from inserted)declare @amount intset @amount=(select inserted.数量from inserted)declare @sale decimalset @sale=(select inserted.销售额from inserted)update产品set产品名称=@cp_name_inwhere产品名称=@cp_name_delupdate产品set产品编号=@cp_num_inwhere产品编号=@cp_num_delupdate客户set客户编号=@cm_num_inwhere客户编号=@cm_num_delupdate客户set客户名称=@cm_name_inwhere客户名称=@cm_name_delupdate销售set销售日期=@date,数量=@amount,销售额=@salewhere产品编号=@cp_num_del and客户编号=@cm_num_del 验证:update view_sell set客户名称='客户M',产品名称='iPhone4s',销售日期='',数量=2,销售额='10000'where产品编号='s00001'and客户编号='c00002'select*from dbo.view_sellorder by产品编号select*from dbo.产品order by产品编号select*from dbo.客户order by客户编号select*from dbo.销售order by产品编号四.实验中的问题及心得经过这次试验让我更深入的了解到触发器的用途以及触发器的使用,刚开始不知道从何出下手,最后查书才搞明白如何解决,通过努力解决这几道题,让我明白如何实现触发器的定义,以及对一些事件的处理过程,如何对表和视图进行创建触发器,以及如何完成相关的级联操作,虽然花费了不少时间,但很有收获。

Sql Server数据库触发器实例讲解文章出处

Sql Server数据库触发器实例讲解文章出处

Sql Server数据库触发器实例讲解文章出处定义:何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。

触发器是一个特殊的存储过程。

常见的触发器有三种:分别应用于Insert , Update , Delete 事件。

(SQL Server 2000定义了新的触发器,这里不提)我为什么要使用触发器?比如,这么两个表: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 truStudentOn Student --在Student表中创建触发器for Update --为什么事件触发As --事件触发后所要做的事情if Update(StudentID)beginUpdate BorrowRecordSet StudentID=i.StudentIDFrom BorrowRecord br , Deleted d ,Inserted i --Deleted和Inserted 临时表Where br.StudentID=d.StudentIDend理解触发器里面的两个临时的表:Deleted , Inserted 。

SqlServer触发器的原理及案例

SqlServer触发器的原理及案例

SqlServer触发器的原理及案例SqlServer触发器的原理及案例合理的选⽤触发器会让你的系统更⾼效2010Ssc⽬录第1章何为触发器 (3)1.1 触发器的'本质' (3)1.2 这样做带来的'功能': (3)1.3 触发器的作⽤ (3)1.4 说明: (3)第2章对触发器3种操作的分析 (4)2.1 创建触发器 (4)2.2 学习案例 (5)2.2.1 建⽴表 (5)2.2.2 触发器练习1 (5)2.2.3 触发器练习2: (6)第3章图形化操作触发器 (7)3.1 查看触发器情况 (7)第4章触发器中的变量操作 (11)第5章SQL触发器语法参考 (11)第1章何为触发器1.1触发器的'本质'触发器是⼀种特殊的存储过程,它不能被显式地调⽤,⽽是在往表中插⼊记录、更改记录或者删除记录时,当事件发⽣时,才被⾃动地激活。

1.2这样做带来的'功能':触发器可以⽤来对表实施复杂的完整性约束,保持数据的⼀致性,当触发器所保护的数据发⽣改变时,触发器会⾃动被激活,响应同时执⾏⼀定的操作(对其它相关表的操作),从⽽保证对数据的不完整性约束或不正确的修改。

触发器可以查询其它表,同时也可以执⾏复杂的T-SQL语句。

触发器和引发触发器执⾏的命令被当作⼀次事务处理,因此就具备了事务的所有特征。

注意:'事务具备什么特征?在触发器中的作⽤?'如果发现引起触发器执⾏的T-SQL语句执⾏了⼀个⾮法操作,⽐如关于其它表的相关性操作,发现数据丢失或需调⽤的数据不存在,那么就回滚到该事件执⾏前的SQL SERVER数据库状态。

1.3触发器的作⽤触发器可以对数据库进⾏级联修改,这⼀点刚才已经说过了。

需要说明的是:'触发器和约束的关系和区别'(1)⼀般来说,使⽤约束⽐使⽤触发器效率更⾼。

(2)同时,触发器可以完成⽐CHECK约束更复杂的限制。

使用SQLServer触发器实现数据表的级联更新-最新资料

使用SQLServer触发器实现数据表的级联更新-最新资料

使用SQLServer触发器实现数据表的级联更新-最新资料使用SQL Server触发器实现数据表的级联更新0 引言数据库完整性就是保证数据库中数据的正确性和一致性。

其中正确性指数据要符合语义规范,数据定义在规范的有效范围内;一致性是指数据库中所表示的同一事物的数据应当一致。

在SQL Server中数据库完整性主要有约束来定义,约束定义了必须遵循的用于维护数据一致性和正确性的有效性规则。

简单的完整性要求可以在定义基本表时通过创建约束来实现,但如果想要实现更为复杂的数据完整性要求,比如依据数据表的变化实现数据的自动级联更新等,这就需要用触发器来完成了。

本文浅析了在 SQL Server中通过触发器实现数据库完整性的原理,并结合一个实例分析了使用触发器实现级联更新的一般过程。

1 触发器概述及其工作原理触发器是SQL Server数据库的重要工具,可以被看作是一种特殊的存储过程。

一般的存储过程通过存储过程名称被调用执行,而触发器是通过数据库事件的触发而被执行,在对触发器所监控的表执行添加、修改或删除操作时触发器被触发。

触发器的过程体中可以包含复杂的SQL语句,因此触发器可以实现比约束更加复杂的数据完整性要求。

在 SQL Server 2005 中有两种触发器: DDL触发器和 DML 触发器。

DDL触发器是被数据定义语句(DDL)所触发而被调用的触发器;DML触发器是被数据操作语句(DML)所触发而被调用的触发器。

数据完整性规则主要由DML 触发器创建,因此本文主要讨论DML触发器。

由于触发器被激活后所执行的操作不同,SQL Server中包含两种触发方式: After触发方式和Instead Of触发方式。

After触发方式是比较常用的触发方式(另有一种For触发方式与After相同,是为与 SQL Server 早期版本兼容的可选项),这种触发方式的触发器在进行数据操作以后被触发,先执行了触发语句(插入、更新、删除),然后执行了触发器。

SQLServer:触发器实例详解

SQLServer:触发器实例详解

SQLServer:触发器实例详解1. 概述触发器是⼀种特殊的存储过程,它不能被显式地调⽤,⽽是在往表中插⼊记录﹑更新记录或者删除记录时被⾃动地激活。

所以触发器可以⽤来实现对表实施复杂的完整性约束。

2. 触发器的分类SQL Server2000提供了两种触发器:“Instead of” 和“After” 触发器。

⼀个表或视图的每⼀个修改动作(Insert、Update和Delete)都可以有⼀个“Instead of” 触发器,⼀个表的每个修改动作都可以有多个“After”触发器。

2.1 “Instead of”触发器“Instead of”触发器在执⾏真正“插⼊”之前被执⾏。

除表之外,“Instead of” 触发器也可以⽤于视图,⽤来扩展视图可以⽀持的更新操作。

“Instead of”触发器会替代所要执⾏的SQL语句,⾔下之意就是所要执⾏SQL并不会“真正执⾏”alter trigger trigger_学⽣_Deleteon 学⽣instead of Deleteasbeginselect 学号, 姓名 from deletedenddelete from 学⽣ where 学号 = 4上例中定义了“trigger学⽣_Delete”触发器,该触发器从“delete”表中打印出所要删除的学⽣.在执⾏“delete”操作后,会发现“学号 = 4”的学⽣并未被删除,原因在于“trigger学⽣Delete”替代了所要执⾏的“delete from 学⽣ where 学号 = 4”语句,⽽在“trigger学⽣_Delete”中并未真正删除学⽣。

2.2 “After”触发器“After”触发器在Insert、Update或Deleted语句执⾏之后被触发。

“After”触发器只能⽤于表。

“After”触发器主要⽤于表在修改后(insert、update或delete操作之后),来修改其他表3. Inserted和Deleted表SQL Server为每个触发器都创建了两个专⽤表:Inserted表和Deleted表。

SQLServer数据库技术-08触发器

SQLServer数据库技术-08触发器

14
设计触发器
15
例:为Products表添加触发器
CREATE TRIGGER 产品_Insert ON Products AFTER INSERT AS BEGIN print '又添加了一种产品' END GO Insert into Products(ProductName) values ('Product') Go
4
触发器的功能




完成比约束更复杂的数据约束 检查所做的SQL是否允许 修改其他数据表里的数据 调用更多的存储过程 发送SQL Mail 返回自定义的错误信息 更改原来要操作的SQL语句 防止数据表结构更改或数据表被删除
5
触发器分类

DML触发器
After触发器 Instead of触发器


21
Sp_settriggerorder 触发器名,激活次序,激活触发器的动作
例:设置触发器次序 Exec sp_settriggerorder '产品_Insert1','First','Insert' go Exec sp_settriggerorder '产品_Insert','Last','Insert' Go
8
在“产品库存”表里,如果要删除一条产品记录 ,在删除记录时,触发器可以检查该产品库存数 量是否为0,如果不为0则取消删除操作。 Step1:接收SQL语句,将要从“产品库存”表里删 除的记录取出来,放在删除表里。 Step2:从“产品库存”表里删除该产品记录。 Step3:从删除表里读出该产品的库存数量字段, 判断是不是0。如果是0,完成操作,从内存中清 除删除表;如果不为0,用Rollback Transaction语 句回滚操作。

sqlserver的触发器练习实例

sqlserver的触发器练习实例

sqlserver的触发器练习实例触发器的概念:它是由事件驱动的,就像java中的监听,当某个事件发⽣了,就会做⼀些⼯作。

下⾯直接上⼲货,创建insert触发器、delete触发器、DDL触发器和如何查看触发器定义1.创建三个表学⽣表、班级表、课程表create database student_scoreGO--在数据库中创建三个表学⽣表、班级表、课程表的结构use student_scoreGOcreate table student( stu_id char(8) primary key,stu_name char(10),stu_sex char(2),stu_birthday smalldatetime,class_id char(6))gocreate table class( class_id char(6) primary key,class_name varchar(30),class_num int,)create table course( course_id char(3) primary key,course_name varchar(30),)gocreate table score( stu_id char(8),course_id char(3),score int check(score>=0 and score<=100)primary key(stu_id,course_id))go2.插⼊⽤例数据--往表中插⼊数据(student,course,score)insert into student values('0601001','李⽟','⼥','1987-05-06', '0601')insert into student values('0601002','鲁敏','⼥','1988-06-28', '0601')insert into student values('0601003','李⼩路','⼥','1987-01-08', '0601')insert into student values('0601004','鲁斌','男','1988-04-21', '0601')insert into student values('0601005','王宁静','⼥','1986-05-29', '0601')insert into student values('0601006','张明明','男','1987-02-24', '0601')insert into student values('0601007','刘晓玲','⼥','1988-12-21', '0601')insert into student values('0601008','周晓','男','1986-04-27', '0601')insert into student values('0601009','易国梁','男','1985-11-26', '0601')insert into student values('0601010','季风','男','1986-09-21', '0601')insert into class values('0501','计算机办公应⽤', 40)insert into class values('0502','⽹络构建', 43)insert into class values('0503','图形图像', 48)insert into class values('0601','可视化', 41)insert into class values('0602','数据库', 38)insert into class values('0603','⽹络管理', 45)insert into class values('0604','多媒体', 40)insert into class values('0701','计算机办公应⽤', 39)insert into class values('0702','WEB应⽤', 38)insert into class values('0703','⽹络构建', 40)insert into course values('001','计算机应⽤基础')insert into course values('002','关系数据基础')insert into course values('003','程序设计基础')insert into course values('004','数据结构')insert into course values('005','⽹页设计')insert into course values('006','⽹站设计')insert into course values('007','SQL Server 2000关系数据库')insert into course values('008','SQL Server 2000程序设计')insert into course values('009','计算机⽹络')insert into course values('010','Windows Server 配置')insert into score values('0601001','001',78)insert into score values('0601002','001',88)insert into score values('0601003','001',65)insert into score values('0601004','001',76)insert into score values('0601005','001',56)insert into score values('0601006','001',87)insert into score values('0601007','001',67)insert into score values('0601008','001',95)insert into score values('0601009','001',98)insert into score values('0601010','001',45)insert into score values('0601001','002',48)insert into score values('0601002','002',68)insert into score values('0601003','002',95)insert into score values('0601004','002',86)insert into score values('0601005','002',76)insert into score values('0601006','002',57)insert into score values('0601007','002',77)insert into score values('0601008','002',85)insert into score values('0601009','002',98)insert into score values('0601010','002',75)insert into score values('0601001','003',88)insert into score values('0601002','003',78)insert into score values('0601003','003',65)insert into score values('0601004','003',56)insert into score values('0601005','003',96)insert into score values('0601006','003',87)insert into score values('0601007','003',77)insert into score values('0601008','003',65)insert into score values('0601009','003',98)insert into score values('0601010','003',75)insert into score values('0601001','004',74)insert into score values('0601002','004',68)insert into score values('0601003','004',95)insert into score values('0601004','004',86)insert into score values('0601005','004',76)insert into score values('0601006','004',67)insert into score values('0601007','004',77)insert into score values('0601008','004',85)insert into score values('0601009','004',98)insert into score values('0601010','004',75)insert into score values('0601001','005',74)insert into score values('0601002','005',68)insert into score values('0601005','005',76)insert into score values('0601008','005',85)insert into score values('0601009','005',98)insert into score values('0601010','005',75)insert into score values('0601002','006',88)insert into score values('0601003','006',95)insert into score values('0601006','006',77)insert into score values('0601008','006',85)insert into score values('0601010','006',55)insert into score values('0601001','007',84)insert into score values('0601002','007',68)insert into score values('0601003','007',95)insert into score values('0601004','008',86)insert into score values('0601005','008',76)insert into score values('0601006','008',67)insert into score values('0601007','009',67)insert into score values('0601008','009',85)insert into score values('0601009','010',98)insert into score values('0601010','010',75)3.练习实例--1)在student上创建INSERT触发器stu_insert,要求在student表中插⼊记录时(要求每次只能插⼊⼀条记录),这个触发器都将更新class表中的class_nun列。

SQLServer存储过程与触发器

SQLServer存储过程与触发器
– DML触发器又分为两类:After触发器和Instead Of触发器
DDL触发器:
– DDL触发器是在响应数据定义语言(Data Definition Language)事件时执行的存储过程。DDL触发器一般用于 执行数据库中管理任务。如审核和规范数据库操作、防止 数据库表结构被修改等。
– SQL SERVER 2005新增添功能
– 对于这两个表,用户只有读取的权限,没有修改的权限。 – 这两个表的结构与触发器所在数据表的结构是完全一致的,
当触发器的工作完成之后,这两个表也将会从内存中删除。
插入表里存放的是更新前的记录
– 对于插入记录操作来说,插入表里存放的是要插入的数据 – 对于更新记录操作来说,插入表里存放的是要更新的记录。
检查所做的SQL是否允许
– 触发器可以检查SQL所做的操作是否被允许。
例如:在产品库存表里,如果要删除一条产品记录,在删除记录时, 触发器可以检查该产品库存数量是否为零,如果不为零则取消 该删除操作。
修改其它数据表里的数据
– 当一个SQL语句对数据表进行操作的时候,触发器可以根据 该SQL语句的操作情况来对另一个数据表进行操作。
– 系统存储过程在Master数据库中,在其他数据库中 可以直接调用,调用时不必在存储过程名前加上数 据库名。
2021/5/4
4
自定义存储过程
自定义存储过程是由用户创建并能完成 某一特定功能的存储过程。
2021/5/4
5
存储过程的优点
1.提高应用程序的通用性和可移植性 2.可以更有效地管理用户操作数据库的权限 3.可以提高T-SQL的速度 4.减轻服务器的负担 5.块化程序设计。 6.减少操作错误。 7.能自动处理复杂的或敏感的事务。 8.可以实现管理任务自动化。

数据库开发-sql server触发器如何使用实例解析

数据库开发-sql server触发器如何使用实例解析

数据库开发-sql server触发器如何使用实例解析数据库开发-sql server触发器如何使用实例解析在数据库开发中,触发器是一种特殊的存储过程,它会在数据库表发生特定事件时自动执行。

触发器可以帮助我们实现数据的自动化处理和一些复杂的业务逻辑。

在本文中,我将详细介绍SQL Server触发器的使用实例,以帮助您更好理解和应用这一重要的数据库开发技术。

1. 触发器的基本概念在开始之前,让我们先来了解一下触发器的基本概念。

触发器是一种特殊的存储过程,它与数据库表相关联,并在表发生特定事件时自动执行。

这些特定事件包括INSERT、UPDATE和DELETE操作。

触发器可以在数据被修改之前或之后执行,这取决于触发器的类型,分为BEFORE和AFTER两种。

2. SQL Server触发器的创建在SQL Server中,我们可以使用CREATE TRIGGER语句来创建触发器。

以下是一个简单的创建触发器的示例:```sqlCREATE TRIGGER [触发器名称]ON [表名]FOR INSERT, UPDATE, DELETEASBEGIN-- 触发器的逻辑代码END```在上面的示例中,[触发器名称]表示触发器的名称,[表名]表示要关联的数据库表,FOR子句指定了触发器要响应的事件类型,AS子句中包含了触发器的逻辑代码。

3. 触发器的使用实例现在让我们来看一个实际的使用实例,假设我们有一个名为Student的表,其中包含了学生的尊称和芳龄信息。

我们想要在插入新的学生信息时,自动向另外一个名为StudentLog的表中插入一条日志信息,以便记录学生信息的变更历史。

我们可以通过触发器来实现这一功能。

```sqlCREATE TRIGGER trgAfterInsertON StudentAFTER INSERTASBEGININSERT INTO StudentLog (操作类型, 学生尊称, 操作时间)SELECT '新增', inserted.尊称, GETDATE()FROM insertedEND```在上面的示例中,我们创建了一个AFTER INSERT类型的触发器,当向Student表中插入新记录时,触发器会自动执行并向StudentLog 表中插入一条日志信息。

SQLServer触发器实例详解

SQLServer触发器实例详解

SQLServer触发器实例详解Microsoft SQL Server™ 2000 提供了两种主要机制来强制业务规则和数据完整性:约束和触发器。

触发器是⼀种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。

触发器主要是通过事件进⾏触发被⾃动调⽤执⾏的。

⽽存储过程可以通过存储过程的名称被调⽤。

Ø 什么是触发器触发器对表进⾏插⼊、更新、删除的时候会⾃动执⾏的特殊存储过程。

触发器⼀般⽤在check约束更加复杂的约束上⾯。

触发器和普通的存储过程的区别是:触发器是当对某⼀个表进⾏操作。

诸如:update、insert、delete这些操作的时候,系统会⾃动调⽤执⾏该表上对应的触发器。

SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语⾔语句⽽激发,这些语句有create、alter、drop语句。

优点触发器可通过数据库中的相关表实现级联更改;通过级联引⽤完整性约束可以更有效地执⾏这些更改。

触发器可以强制⽐⽤ CHECK 约束定义的约束更为复杂的约束。

与 CHECK 约束不同,触发器可以引⽤其它表中的列。

例如,触发器可以使⽤另⼀个表中的 SELECT ⽐较插⼊或更新的数据,以及执⾏其它操作,如修改数据或显⽰⽤户定义错误信息。

触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。

DML触发器分为:1、 after触发器(之后触发)a、 insert触发器b、 update触发器c、 delete触发器2、 instead of 触发器(之前触发)其中after触发器要求只有执⾏某⼀操作insert、update、delete之后触发器才被触发,且只能定义在表上。

⽽instead of触发器表⽰并不执⾏其定义的操作(insert、update、delete)⽽仅是执⾏触发器本⾝。

既可以在表上定义instead of触发器,也可以在视图上定义。

SQLServer之创建DMLAFTERINSERT触发器

SQLServer之创建DMLAFTERINSERT触发器

SQLServer之创建DMLAFTERINSERT触发器DML AFTER INSERT触发器创建原理触发器触发时,系统⾃动在内存中创建deleted表或inserted表,内存中创建的表只读,不允许修改,触发器执⾏完成后,⾃动删除。

insert触发器⼯作原理:第⼀步执⾏insert插⼊语句,在表中插⼊数据⾏,第⼆步触发insert触发器,向系统临时表insert表中插⼊新⾏的备份(副本),第三步触发器检查insert表中插⼊的新⾏数据,确定是否要回滚或执⾏其他操作。

不能使⽤SSMS数据库管理⼯具直接创建DML添加触发器,可以使⽤T-SQL脚本创建DML添加触发器。

DML AFTER INSERT触发器创建语法:包含参数释义--声明数据库引⽤use 数据库名;go--判断是否存在触发器,如果存在则删除if exists(select * from sysobjects where name=触发器名)drop trigger 触发器名;go--创建插⼊触发器createtrigger --触发器标识符--DML 触发器所属架构的名称。

DML 触发器的作⽤域是为其创建该触发器的表或视图的架构。

不能为 DDL 或登录触发器指定[架构名称.] 触发器名 --触发器的名称--对其执⾏ DML 触发器的表或视图,有时称为触发器表或触发器视图。

可以根据需要指定表或视图的完全限定名称。

视图只能被 INSTEAD OF 触发器引⽤。

不能对局部或全局临时表定义 DML 触发器。

on [架构名称.] { 表名 | 视图名 }with--对 CREATE TRIGGER 语句的⽂本进⾏模糊处理。

使⽤WITH ENCRYPTION可以防⽌将触发器作为SQL Server复制的⼀部分进⾏发布。

不能为CLR 触发器指定 WITH ENCRYPTION。

encryption,--指⽰触发器已本机编译。

(只能应⽤于table)--内存优化表上的触发器需要使⽤此选项。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

触发器
⏹触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化(INSERT、
UPDATE 或DELETE)时自动执行
⏹触发器可以查询其它表,并可以包含复杂的Transact-SQL 语句
⏹主要用于强制复杂的业务规则或要求
优点
⏹自动执行
⏹实现相关表层叠修改,实现多个表之间数据的一致性和完整性
⏹实现比check约束更复杂的限制,可以引用其他表中的列
触发器的类型
⏹AFTER触发器:在数据变动(INSERT、UPDATE、DELETE操作)完成后激发,只能在表
上定义,同一个表中可以有多个AFTER触发器
⏹INSTEAD OF触发器:在数据变动以前被激发,并取代变动数据(INSERT、UPDATE、
DELETE操作),转而去执行触发器定义的操作,可以定义在表或视图上,每个update、insert和delete语句最多可以定义一个INSTEAD OF触发器。

创建触发器
⏹CREATE TRIGGER trigger_name
ON { table | view } [ WITH ENCRYPTION ]
{
{ FOR | AFTER | INSTEAD OF }
{ [ INSERT ] [ , ] [ UPDATE ] [, ][DELETE]}
AS
sql_statement [...n ]
}
触发器示例:
⏹CREATE TRIGGER reminder ON titles FOR INSERT, UPDATE
AS
RAISERROR (50009, 16, 10)
指定触发器何时激发
⏹AFTER 触发器在触发操作(INSERT、UPDATE 或DELETE)后和处理完任何约束后激
发。

可通过指定AFTER 或FOR 关键字来请求AFTER 触发器。

⏹INSTEAD OF 触发器代替触发动作进行激发,并在处理约束之前激发。

⏹对于每个触发操作(UPDATE、DELETE 和INSERT),每个表或视图只能有一个
INSTEAD OF 触发器。

而一个表对于每个触发操作可以有多个AFTER 触发器。

触发器示例:
create TRIGGER reminder
ON titles
FOR INSERT, delete,update
AS
--修改操作
if (select count(*) from inserted) > 0 and (select count(*) from deleted) >0
begin
RAISERROR ('修改成功', 16, 10)
end
--插入操作
if (select count(*) from inserted) > 0 and (select count(*) from deleted) = 0 begin
RAISERROR ('插入成功', 16, 10)
end
--删除操作
if (select count(*) from inserted) = 0 and (select count(*) from deleted) >0 begin
RAISERROR ('删除成功', 16, 10)
end。

相关文档
最新文档