概述
触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。触发器主要是通过事件进行触发被自动调用执行的。而存储过程可以通过存储过程的名称被调用。
Ø 什么是触发器
触发器对表进行插入、更新、删除的时候会自动执行的特殊存储过程。触发器一般用在check约束更加复杂的约束上面。触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作。诸如:update、insert、delete这些操作的时候,系统会自动调用执行该表上对应的触发器。SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、alter、drop语句。
DML触发器分为:
1、 after触发器(之后触发)
a、 insert触发器
b、 update触发器
c、 delete触发器
2、 instead of 触发器 (之前触发)
其中after触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上。而instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。
五﹕使用T-SQL语句来创建触发器 基本语句如下﹕
create trigger trigger_name
on {table_name | view_name}
{for | After | Instead of } [ insert, update,delete ]
as sql_statement
六﹕删除触发器: 基本语句如下﹕
drop trigger trigger_name
七:查看数据库中已有触发器:
-- 查看数据库已有触发器
use jxcSoftware go select * from sysobjects where xtype='TR'
-- 查看单个触发器 exec sp_helptext '触发器名'
八﹕修改触发器:
基本语句如下﹕ alter trigger trigger_name
on {table_name | view_name}
{for | After | Instead of } [ insert, update,delete ]
as sql_statement
1、触发器实例
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
实例2:
--创建一张学生表(Student)
--创建一张学生借书登记表(BorrowRecord)
Create Table Student( --学生表
StudentID int primary key, --学号
StudentName varchar(20) --学生名称
)
Create Table BorrowRecord( --学生借书记录表
BorrowRecord int identity(1,1), --流水号
StudentID int , --学号
BorrowDate datetime, --借出时间
ReturnDAte datetime, --归还时间
)
------创建一个触发器(修改学生表中的学生id时 同时修改学生借书记录表中的学号)
-------------------------------------------------------
--Name:t_update_Student
--func:更新BorrowRecord 的StudentID,与Student同步。
--Use :None
--User:System
--Author:
--Date : 2009-12-26
-------------------------------------------------------
----触发器修改方法一
Create Trigger t_update_Student
On Student
for Update
As
if Update(StudentID)
begin
Update br
Set br.StudentID=ins.StudentID
From BorrowRecord br , Deleted del ,Inserted ins
Where br.StudentID=del.StudentID
end
----触发器修改方法二
Create Trigger t_update_Student
On Student
for Update
As
if Update(StudentID)
begin
declare @newid varchar(50)
declare @oldid varchar(50)
select @oldid=StudentID from deleted
select @newid=StudentID from Inserted
update BorrowRecord set StudentID=@newid where StudentID=@oldid
end
------创建一个触发器(删除学生表中的学生id时 同时删除学生借书记录表中的学号)
-------------------------------------------------------
--Name:t_del_Student
--func:同时删除 BorrowRecord 的数据
--Use :None
--User:System
--Author:
--Date : 2009-12-26
-------------------------------------------------------
Create trigger t_del_Student
On Student
for delete
As
begin
declare @sid varchar(50)
select @sid=StudentID from deleted
delete from BorrowRecord where StudentID=@sid
end
----解释:inserted、deleted
--这是两个虚拟表,inserted 保存的是 insert 或 update之后的记录,deleted 保存的是delete 或 update 之前的记录。
---------创建完毕
SELECT type,xtype,name FROM sysobjects
----检查是否存在某触发器 可结合删除创建触发器语句执行
if EXISTS (SELECT name
FROM sysobjects
WHERE name = 't_del_Student' --触发器名
AND type = 'TR')
begin
--DROP TRIGGER Trig_Del ---执行相应的操作
print 'yes'
end
else
begin ---不存在则执行别的操作
print 'no'
end
----解释sysobjects 为系统系统对象表。 保存当前数据库的对象,如约束、默认值、日志、规则、存储过程等
--字段 name为 对象名称
--字段 type为 对象类型 ‘TR’为 触发器
-----删除触发器
DROP TRIGGER t_update_Student
DROP TRIGGER t_del_Student
---现在插入数据
---给Student插入数据
insert into Student(StudentID,StudentName) values(2009001001,'张三')
insert into Student(StudentID,StudentName) values(2009001002,'李四')
insert into Student(StudentID,StudentName) values(2009001003,'王五')
---给BorrowRecord插数据
insert into BorrowRecord(StudentID,BorrowDate,ReturnDAte) values(2009001001,getdate(),getdate())
insert into BorrowRecord(StudentID,BorrowDate,ReturnDAte) values(2009001002,getdate(),getdate())
insert into BorrowRecord(StudentID,BorrowDate,ReturnDAte) values(2009001003,getdate(),getdate())
---查询两表数据
select * from Student
select * from BorrowRecord
----修改Student表中张三的记录
update Student set StudentID='2009001008' where StudentID='2009001001'
--控制台信息
--(所影响的行数为 1 行)
--(所影响的行数为 1 行)
---说明修改触发器执行成功
---继续测试删除
delete from Student where StudentID='2009001008'
----查看触发器内容
exec sp_helptext 't_update_Student'---触发器名称
----查看触发器属性
exec sp_helptrigger Student ---表名
-----触发器回滚
---如果程序不想用户修改学生名称则可以修改此触发器
---如果用户要修改学生名称(StudentName)则回滚
create trigger t_roll_Student
on Student
for update
as
if update(StudentName)
rollback tran
--禁用、启用触发器
--禁用:
alter table 表名 disable trigger 触发器名称
--启用:
alter table 表名 enable trigger 触发器名称
--重命名触发器
exec sp_rename 原名称, 新名称
----因本例所以没能写插入触发器
--假如一张学生表 另一张BorrowRecord为借书证表
--要在增加一个学生时因在BorrowRecord表里增加一条记录的话则需要建触发器
------创建一个触发器(增加学生表中的学生时 同时增加学生借书证表中的记录)
-------------------------------------------------------
--Name:t_add_Student
--func:增加BorrowRecord 的记录,与Student同步。
--Use :None
--User:System
--Author:
--Date : 2009-12-26
-------------------------------------------------------
----触发器增加
Create Trigger t_add_Student
On Student
for insert
As
begin
declare @newid varchar(50)
select @newid=StudentID from Inserted --得到插入的ID
insert into BorrowRecord(StudentID,BorrowDate,ReturnDAte) values(@newid,getdate(),getdate())
end
--测试
insert into Student(StudentID,StudentName) values(2009001004,'小王')
最后
以上就是平淡大炮为你收集整理的sql server2008 触发器的全部内容,希望文章能够帮你解决sql server2008 触发器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复