告诉我啥子是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.触发机制。
常见的触发器有三种:分别应用于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.触发机制。
展开全部
说简单点就是执行某个操作时需要执行的另一个操作
比如我在删除这个表中的某行时需要将这个删除的数据记录到另外一张表中,就可以做一个触发器.
当然也可以对插入,和更新做触发器
触发器分为两种,一种是在操作之前执行的触发器,称为after型触发器,一种是在操作后执行的触发器,成为instead型触发器.
-- 创建一个事后触发的删除触发器
CREATE TRIGGER Del_ST ON [dbo].[Students]
for DELETE
AS
Print '正在准备删除学生记录...'
Print '开始检验是否存在学生的选课信息...'
-- 系统会在触发器执行时自动建立deleted表来存储删除掉的记录的副本
-- 可以用下面的Select语句看看deleted的内容
-- select 学号,姓名,年龄 from deleted
if exists (Select * from deleted
where exists ( select * from score
Where Score.学号=deleted.学号)
)
begin
-- 存在学生成绩,必须用rollback恢复删除
-- 把下面的rollback取消了看看能真正恢复删除吗
rollback
print '存在学生的成绩记录,无法完成本次删除操作!'
Return
End
-- 对FOR/AFTER型触发器如果要确定删除,无需用Commit
declare @cnt int
Select @cnt=Count(*) from deleted
if @cnt>0
begin
print '删除记录成功!'
print '一共删除了'+CAST(@cnt AS Varchar(10))+
'个学生的记录'
end
else
print '没有删除任何学生'
GO
-- 创建一个事前触发的删除触发器
CREATE TRIGGER Del_ST ON [dbo].[Students]
instead of DELETE
AS
Print '正在准备删除学生记录...'
Print '开始检验是否存在学生的选课信息...'
-- 系统会在触发器执行时自动建立deleted表来存储删除掉的记录的副本
-- 可以用下面的Select语句看看deleted的内容
-- select 姓名,sname,年龄 from deleted
if exists (Select * from deleted
where exists ( select * from score
Where Score.学号=deleted.学号)
)
begin
-- 存在学生成绩,撤消删除,并结束触发器
-- 注意无需Rollback
print '存在学生的成绩记录,取消本次删除操作!'
Return
End
-- 需要手工实现真正的删除
--
Declare @cnt int
Select @cnt=count(*) from deleted
if @cnt>0
begin
-- 把下面的delete语句取消了看看是否真正地删除了记录吗
delete from Students
Where Students.姓名 = ANY (Select 姓名 from Deleted)
print '删除记录成功!'
print '一共删除了'+CAST(@cnt AS Varchar(10))+
'个学生的记录'
end
else
print '没有删除任何学生!'
GO
比如我在删除这个表中的某行时需要将这个删除的数据记录到另外一张表中,就可以做一个触发器.
当然也可以对插入,和更新做触发器
触发器分为两种,一种是在操作之前执行的触发器,称为after型触发器,一种是在操作后执行的触发器,成为instead型触发器.
-- 创建一个事后触发的删除触发器
CREATE TRIGGER Del_ST ON [dbo].[Students]
for DELETE
AS
Print '正在准备删除学生记录...'
Print '开始检验是否存在学生的选课信息...'
-- 系统会在触发器执行时自动建立deleted表来存储删除掉的记录的副本
-- 可以用下面的Select语句看看deleted的内容
-- select 学号,姓名,年龄 from deleted
if exists (Select * from deleted
where exists ( select * from score
Where Score.学号=deleted.学号)
)
begin
-- 存在学生成绩,必须用rollback恢复删除
-- 把下面的rollback取消了看看能真正恢复删除吗
rollback
print '存在学生的成绩记录,无法完成本次删除操作!'
Return
End
-- 对FOR/AFTER型触发器如果要确定删除,无需用Commit
declare @cnt int
Select @cnt=Count(*) from deleted
if @cnt>0
begin
print '删除记录成功!'
print '一共删除了'+CAST(@cnt AS Varchar(10))+
'个学生的记录'
end
else
print '没有删除任何学生'
GO
-- 创建一个事前触发的删除触发器
CREATE TRIGGER Del_ST ON [dbo].[Students]
instead of DELETE
AS
Print '正在准备删除学生记录...'
Print '开始检验是否存在学生的选课信息...'
-- 系统会在触发器执行时自动建立deleted表来存储删除掉的记录的副本
-- 可以用下面的Select语句看看deleted的内容
-- select 姓名,sname,年龄 from deleted
if exists (Select * from deleted
where exists ( select * from score
Where Score.学号=deleted.学号)
)
begin
-- 存在学生成绩,撤消删除,并结束触发器
-- 注意无需Rollback
print '存在学生的成绩记录,取消本次删除操作!'
Return
End
-- 需要手工实现真正的删除
--
Declare @cnt int
Select @cnt=count(*) from deleted
if @cnt>0
begin
-- 把下面的delete语句取消了看看是否真正地删除了记录吗
delete from Students
Where Students.姓名 = ANY (Select 姓名 from Deleted)
print '删除记录成功!'
print '一共删除了'+CAST(@cnt AS Varchar(10))+
'个学生的记录'
end
else
print '没有删除任何学生!'
GO
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询