SqlServer触发器的原理及案例
触发器
⏹触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化(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。
整理的关于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中数据增删改 触发器写法
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数据库触发器的工作原理
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触发器例题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课件触发器
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触发器(附有实例)触发器:即当发⽣某⼀事件时,如果满⾜给定条件,则执⾏相应的动作。
它的基本架构:触发器创建语法:(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编程之触发器
李四
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页]
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基础之(触发器)阅读⽬录概念: 触发器(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触发器
课程数据库原理及应用_ 实验名称 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产品编号四.实验中的问题及心得经过这次试验让我更深入的了解到触发器的用途以及触发器的使用,刚开始不知道从何出下手,最后查书才搞明白如何解决,通过努力解决这几道题,让我明白如何实现触发器的定义,以及对一些事件的处理过程,如何对表和视图进行创建触发器,以及如何完成相关的级联操作,虽然花费了不少时间,但很有收获。
