SQL Server 2000 程序设计学习笔记--第九章 触发器

来源:互联网 发布:步态分析软件 编辑:程序博客网 时间:2024/06/05 20:17

9.1何谓触发器
SQL Server2000提供了两种数据完整性的主要机制:条件约束及触

发器
触发程序以及包含在触发程序内的语句都可以视为一个事务,因此

在事务过程中如果遇到严重的错误时,会自动地复原整个事务

9.2设计触发程序及激活触发程序的时间

设计触发程序时,SQL Server 2000提供两种选项来创建触发程序:
INSTEAD OF触发程序是用来代替正常的触发操作
AFTER 触发程序会在执行INSERT UPDATE或DELETE语句的操作之后
才执行,但是AFTER触发程序只能针对表来操作

指定激活除法程序的时间

使用触发程序的限制

注意:创建除法程序时,触发并不是以行为基础,而是以集合为基础

,因此多行的更改是合法的

触发程序所使用的特殊表格
两个供触发程序使用的表格:inserted和deleted
虽然提供这两个特殊表格供用户浏览,但是用户却无法直接改变表

格中的数据

inserted及deleted表格的用途
inserted表格会用来存储执行insert及update语句之后所影响的行

内容
deleted表格会存储因执行delete和update语句而受到影响的行内容

范例
--创建一个名称为test_tr的触发器,当执行添加,更新或删除时
--都可以激活此触发程序
Create trigger test_tr on titles_copy for

insert,update,delete
as
select * from inserted
select * from deleted
go
--修改price的字段值为10当进行update语句时,将会触发test_tr
--触发程序,并且会显示inserted及deleted表格内容
update titles_copy set price=10 where type like '%cook%'
--将创建的test_tr触发程序删除
drop trigger test_tr
go
程序名称:EX-1.SQL

创建多行的触发器

insert 语句它一次只能添加一笔记录至表格内,而update及delete

语句则可以处理多笔数据
如果要添加多笔记录时可以使用insert into(table_name) select

语句来激活insert触发程序,因此插入许多行时只可能激活单一的

触发程序
范例
--执行多行的insert语句
create trigger intrig
on sales
after insert as
update titles set ytd_sales=ytd_salses-qty from inserted

where titles.title_id=inserted.title_id
程序名称:EX-4.SQL

9.3创建触发器

create trigger建立触发程序

注意在触发器内是不可以接受任何参数,也不需要设置return数值

,因为触发器是自动被执行的

范例
--创建一个触发程序
create trigger new_trigger on authors for update
as
print '数据已更新'
go
update authors set state='CA' where AU_ID='238.95.7766'
go
程序名称:EX-5.SQL

删除触发程序

范例
--创建一个触发程序
create trigger new_trigger on authors for update
as
print '数据已更新'
go
update authors set state='CA' where AU_ID='238.95.7766'
go
--删除触发程序
drop trigger new_trigger
go
程序名称:EX-6.SQL

如果进行查看触发程序的相关信息

sp_helptrigger

范例
--创建一个触发程序
create trigger new_trigger on authors for update
as
print '数据已更新'
go
update authors set state='CA' where AU_ID='238.95.7766'
go
--显示触发程序的相关信息
sp_helptrigger 'authors'
go

查看触发程序的拥有者及创建日期的数据

范例
--创建一个new_trigger触发程序
create trigger new_trigger on authors for update
as
print '数据已更新'
go
update authors set state='CA' where AU_ID='238.95.7766'
go
--显示触发程序的相关信息
sp_help 'new_trigger'
go

查看触发程序的内容
sp_helptext '触发程序名称'

范例
sp_helptext 'new_trigger'
go

使用ROLLBACK TRANSACTION的触发程序

在执行ROLLBACK TRANSACTION语句时并不会返回任何消息给用户,

因此在存储过程或触发程序中需要警告信息时,可使用RAISERROR或

PRINT语句来进行提示。

范例
--创建一个触发程序
create trigger new_trigger on authors for update
as
if @@rowcount=0
begin
print '数据无法更新'
rollback transaction
end
go
update authors set state='CA' where au_id='238-95-7765'
go
程序名称:EX-10.SQL

@@ROWCOUNT是用来返回受到上一个语句所影响行的数目

范例
--当au_id='427-17-2320'时,则进行更新
--若没有任何数据被更新时,则显示信息
update authors set au_lname='Jones' where au_id='472-17-

2320'
if @@rowcount=0
print '没有任何数据更新'
程序名称:EX-2.SQL

递归触发

所提供的递归触发程序只能调用到32层

检查目前数据库的递归触发功能是否打开
EXEC sp_dboption pubs,'recursive trigger'
sp_dboption 所设置的值是只有针对目前所在数据库有效

将目前数据库的递归触发打开
EXEC sp_dboption pubs,'recursive triggers',true

将打开的递归触发功能关闭时
exec sp_dboption pubs,'recursive triggers',false

范例
--将递归触发功能打开
exec sp_dboption pubs,'recursive triggers',true
go
create table test_db (ID int IDENTITY)
GO
create trigger test_trigger on test_db for insert
as
insert test_db default values
go
insert test_db default values
go
--将递归触发功能关闭
exec sp_dboption pubs,'recursive triggers',false
go
程序名称:EX-3.SQL


9.4一对多关系型表格的更新和删除

利用deleted和inserted表



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=613524