sqlserver的触发器练习实例

触发器的概念:它是由事件驱动的,就像java中的监听,当某个事件发生了,就会做一些工作。

下面直接上干货,创建insert触发器、delete触发器、DDL触发器和如何查看触发器定义

1.创建三个表学生表、班级表、课程表

create database student_score
GO
--在数据库中创建三个表学生表、班级表、课程表的结构
use student_score
GO
create table student
( stu_id char(8) primary key,
  stu_name char(10),
  stu_sex char(2),
  stu_birthday smalldatetime,
  class_id char(6)
)
go
create 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),
)
go
create table score
( stu_id char(8),
  course_id char(3),
  score int check(score>=0 and score<=100)
  primary key(stu_id,course_id)
)
go

2.插入用例数据

--往表中插入数据(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列。并测试触发器stu_insert。
create trigger stu_insert
on student
for insert
as
update class set class_num=class_num + 1
where class_id=(select class_id from inserted)

--测试
insert into student values(‘0602011‘,‘文‘,‘女‘,‘1986-09-21‘, ‘0602‘)

--2)在student上创建DELETE触发器stu_delete,要求在student表中删除记录时,这个触发器都将更新class表中的class_nun列。并测试触发器stu_delete。
create trigger stu_delete
on student
for insert
as
update class set class_num=class_num - 1
where class_id = (select class_id from deleted)

--测试
delete from student where stu_id=‘0601001‘ 

--3)查看触发器相关信息:使用系统存储过程sp_help,sp_helptext查看触发器相关信息。
exec sp_help
exec sp_help stu_insert
exec sp_helptext stu_insert

--4)对于下列触发器:
create trigger stu_update
on student
instead of update
as
print ‘修改学生表‘
drop trigger stu_update
执行语句
update student
set stu_id=‘0601003‘
where stu_name=‘鲁斌‘
会怎么样?
--消息 2627,级别 14,状态 1,第 1 行
--违反了 PRIMARY KEY 约束 ‘PK__student__E53CAB217F60ED59‘。不能在对象 ‘dbo.student‘ 中插入重复键。
--语句已终止。

--5)创建DDL触发器,在当前数据库中不允许删除或修改表
create trigger data
on database
for drop_table, alter_table
as
print ‘不允许删除或修改表‘
rollback

此例很完整,供有需要进行练习触发器的朋友看看

时间: 2024-10-29 19:12:29

sqlserver的触发器练习实例的相关文章

SQLServer创建触发器,更新表

在SQLServer,触发器,插入.更新.删除状态: CREATE TRIGGER t_inms_alarms ON [PHS].[dbo].[AlarmCurrent] FOR INSERT, DELETE AS DECLARE @rows int SELECT @rows = @@rowcount IF @rows = 0 return --如果表是插入,则同步更新AlarmsMiddleTbl IF EXISTS(SELECT 1 FROM inserted) AND NOT EXISTS

在SQLServer使用触发器实现数据完整性

1.实现数据完整性的手段 在sqlserver中,在服务器端实现数据完整性主要有两种手段:一种是在创建表时定义数据完整性,主要分为:实体完整性.域完整性.和级联参照完整性:实现的手段是创建主键约束.唯一键约束.检查约束.默认值约束和各种级联完整性约束.另一种是通过编写触发器语句来实现,通过定义触发条件和编写触发后执行语句,来实现对数据表操作的各种约束. 2.触发器的概念 触发器是一种特殊的存储过程.通常用于实现强制业务规则和数据完整性.触发器是通过事件触发而由系统自动执行.主要体现在它在插入.删

MySQL 触发器简单实例

CREATE TRIGGER <触发器名称>  --触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.{ BEFORE | AFTER }  --触发器有执行的时间设置:可以设置为事件发生前或后.{ INSERT | UPDATE | DELETE }  --同样也能设定触发的事件:它们可以在执行insert.update或delete的过程中触发.ON <表名称>  --触发器是属于某一个表的:当在这个表上执行插入. 更新或删除操

SqlServer的触发器

触发器是Sqlserver响应以下任意语句而自动执行的一天T-SQL语句.delete,insert,update.表和视图支持触发器.(但是临时表不支持). 我们在哪些业务场景需要用到触发器呢? 1.每当订购一个产品时,都从库存数量中减去订购的数量. 2.每当增加一个顾客到某个数据库表时,都检查其电话号码格式是否正确,州的缩写是否为大写. 1.首先,创建触发器.触发器用create trigger语句创建.下面是一个简单的例子: create trigger newproduct_trigge

SqlServer之触发器

1.触发器之理论: 触发器(Trigger)是一种特殊类型的存储过程,是在用户对某一种表的数据进行UPDATE.INSERT 和 DELETE 操作时被触发执行的一段程序.触发器有助于强制引用完整性,以便在添加.更新或删除表中的行时保留表之间已定义的关系. 2.触发器工作原理: ① 触发器的名称.② 触发器中进行的操作.③ 触发器操作的执行过程. 3.创建触发器: 可以通过 CREATE TRIGGER 语句建立触发器,其语法格式为: CREATE TRIGGER trigger_name ON

SQLSERVER分布式事务使用实例

尊重原著作:本文参考自http://www.jb51.net/article/43540.htm --BEGIN DISTRIBUTED TRANSACTION [transactionname]--标志一个由分布式事务处理协调器MSDTC管理的TSQL分布式事务开始--SERVER A服务器为主控服务器.当连接发出后续COMMIT TRANSACTION或--ROLLBACK TRANSACTION语句时,主控服务器请求MSDTC在所涉及的服务器间管理--分布式事务的完成 --SQLSERVE

Oracle触发器用法实例详解

本文实例讲述了Oracle触发器用法.分享给大家供大家参考,具体如下: 一.触发器简介 触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行. 因此触发器不需要人为的去调用,也不能调用. 然后,触发器的触发条件其实在你定义的时候就已经设定好了. 这里面需要说明一下,触发器可以分为语句级触发器和行级触发器. 详细的介绍可以参考网上的资料,简单的说就是语句级的触发器可以在某些语句执行前或执行后被触发.而行级触发器则是在定义的了触发的表中的行数据改变时就会被触发一次. 具体举例

[转帖]SQLSERVER 使用触发器实现 禁用sa用户 在非本机登录

原贴地址: https://blog.csdn.net/reblue520/article/details/51580102 具体的方法为: 创建一个触发器 CREATE TRIGGER forbiddensa ON ALL SERVER WITH EXECUTE AS 'sa' FOR LOGON AS BEGIN --选择sa用户进行限制: IF ORIGINAL_LOGIN()= 'sa' --允许sa在本机登录"" AND (SELECT EVENTDATA().value('

sqlserver游标概念与实例全面解说

引言 我们先不讲游标的什么概念,步骤及语法,先来看一个例子:   ?????? 表一 OriginSalary??????????????????????????????????????????????????? 表二 AddSalary 现在有2张表,一张是OriginSalary表--工资表,有三个字段0_ID 员工号(NVARCHAR).O_Name员工姓名(NVARCHAR).O_Salary工资(FLOAT). 另一张表AddSalary表-加薪表.有2个字段,O_ID员工号.A_Sa