1、触发器。
定义: 何为触发器?在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 truStudent
On Student
for Update --触发器类型--Update
-------------------------------------------------------
--Name:truStudent
--func:更新BorrowRecord 的StudentID,与Student同步。
--Use :None
--User:System
--Author: wp_love
--Date : 2003-4-16
--Memo : 临时写写的,给大家作个Sample。没有调试阿。
-------------------------------------------------------
As
if Update(StudentID)
begin
Update BorrowRecord
Set br.StudentID=i.StudentID
From BorrowRecord br , Deleted d ,Inserted i
Where br.StudentID=d.StudentID
end
理解触发器里面的两个临时的表:Deleted , Inserted 。注意Deleted 与
Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。
一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录
到Deleted表,然后删除Student记录并写入新纪录。
对于2,创建一个Delete触发器
Create trigger trdStudent
On Student
for Delete
-------------------------------------------------------
--Name:trdStudent
--func:同时删除 BorrowRecord 的数据
--Use :None
--User:System
--Author:
--Date : 2003-4-16
--Memo : 临时写写的,给大家作个Sample。没有调试阿。
-------------------------------------------------------
As
Delete BorrowRecord
From BorrowRecord br , Delted d
Where br.StudentID=d.StudentID
从这两个例子我们可以看到了触发器的关键:A.2个临时的表;B.触发机制。
这里我们只讲解最简单的触发器。
触发器其实可以看做是一种特别的存储过程,当你进行insert、update、delete
操作时就会触发!
insert触发器,首先会先把insert的数据写到inserted表里面,inserted表可以
看做是一个内存中的临时表!
delete触发器,首先把delete的数据写到deleted表中,同上!
update触发器,update的操作就是先delete再insert,所以会把delete的数据写
到deleted表,insert数据写到insert表
1、代码:写触发器之前一般要判断该触发器是否存在,如果存在则要删除该触发
器,这样可以保证脚本多次运行的时候没有问题。
同样适用于存储过程,但是不能勇于数据表,特别是当数据表有数据的时候。(
我们曾经遇到过,一个成员修改数据库的时候,
重新生成了脚本,结果就把数据全部删掉了)
一般用
IF EXISTS (SELECT name FROM sys.objects WHERE name = '触发器的名字
' AND type = 'TR')
DROP TRIGGER ’触发器名字‘;
GO
2.创建:下边可以开始创建触发器
Create Trigger 触发器名字 On 表
FOR/INSTEAD OF/AFTER ---这里有三个选项:
-- for是针对什么
的触发,也就是当执行某些操作的时候触发(insert,update,delete)
-- after是再操作
之后触发,也就是当某些操作执行完的时候触发(insert,update,delete)
-- instead of 是
替换这些操作(insert,update,delete)
Insert(, Update,delete)可以是一个或者多个的组合
AS
SQL语句
GO
3. 处理
如果是单独针对某个操作的触发器,则不用判断,否则就是要判断操作。
在触发器里边,会有两个临时表供使用inserted 和deleted
如果是insert 操作,则只会在inserted表里边有数据
如果是delete操作,则只会在deleted表里有数据
如果是update操作呢?这里要注意下,update操作的实质,也就是在SQL
DBMS的内部,其实还是执行了
两个操作,delete 和insert。所以,如果是update 这两个临时表都会有数
据,一个是旧的,一个是新的。
SQL游标的简单使用
CREATE PROCEDURE [dbo].[pro_CURSOR]
AS
BEGIN
--声明一个游标
DECLARE MyCURSOR CURSOR FOR
SELECT userid,depid FROM users
--打开游标
open MyCURSOR
--声明两个变量
declare @userid varchar(50)
declare @depid varchar(50)
--循环移动
fetch next from MyCURSOR into @userid,@depid
while(@@fetch_status=0)
begin
update users set description=(select dep_des from department where
)
where
fetch next from MyCURSOR into @userid,@depid
end
close MyCURSOR
deallocate MyCURSOR
END