ACCESS数据库升级到SQL数据库(三)触发器的使用
# 创建insert类型触发器
--创建insert插入类型触发器
if (object_id('tgr_classes_insert', 'tr') is not null)
drop trigger tgr_classes_insert
go
create trigger tgr_classes_insert
on classes
for insert --插入触发
as
--定义变量
declare @id int, @name varchar(20), @temp int;
--在inserted表中查询已经插入记录信息
select @id = id, @name = name from inserted;
set @name = @name + convert(varchar, @id);
set @temp = @id / 2;
insert into student values(@name, 18 + @id, @temp, @id);
print '添加学生成功!';
go
# 创建delete类型触发器
if (object_id('tgr_classes_delete', 'TR') is not null)
drop trigger tgr_classes_delete
go
create trigger tgr_classes_delete
on classes
for delete --删除触发
as
print '备份数据中……';
if (object_id('classesBackup', 'U') is not null)
--存在classesBackup,直接插入数据
insert into classesBackup select name, createDate from deleted;
else
--不存在classesBackup创建再插入
select * into classesBackup from deleted;
print '备份数据成功!';
go
--
--不显示影响行数
--set nocount on;
delete classes where name = '5班';
--查询数据
select * from classes;
select * from classesBackup;
# 创建update类型触发器
if (object_id('tgr_classes_update', 'TR') is not null)
drop trigger tgr_classes_update
go
create trigger tgr_classes_update
on classes
for update
as
declare @oldName varchar(20), @newName varchar(20);
--更新前的数据
select @oldName = name from deleted;
if (exists (select * from student where name like '%'+ @oldName + '%'))
begin
--更新后的数据
select @newName = name from inserted;
update student set name = replace(name, @oldName, @newName) where name like '%'+ @oldName + '%';
print '级联修改数据成功!';
end
else
print '无需修改student表!';
go
# update更新列级触发器
if (object_id('tgr_classes_update_column', 'TR') is not null)# 修改触发器
drop trigger tgr_classes_update_column
go
create trigger tgr_classes_update_column
on classes
for update
as
--列级触发器:是否更新了班级创建时间
if (update(createDate))
begin
raisError('系统提示:班级创建时间不能修改!', 16, 11);
rollback tran;
end
go
alter trigger tgr_message
on student
after delete
as raisError('tgr_message触发器被触发', 16, 10);
go
--test
delete from student where name = 'lucy';
# 启用、禁用触发器
--禁用触发器
disable trigger tgr_message on student;
--启用触发器
enable trigger tgr_message on student;
# 查询创建的触发器信息
--查询已存在的触发器
select * from sys.triggers;
select * from sys.objects where type = 'TR';
--查看触发器触发事件
select te.* from sys.trigger_events te join sys.triggers t
on t.object_id = te.object_id
where t.parent_class = 0 and t.name = 'tgr_valid_data';
--查看创建触发器语句
exec sp_helptext 'tgr_message';
实例
1 ALTER trigger [dbo].[update_task] on [dbo].[编程信息] 2 for delete,insert,update 3 as 4 declare @order nvarchar(20),@name nvarchar(25); 5 declare @mycursor cursor; 6 7 /**删除时执行**/ 8 set @mycursor = cursor for select 令号,编程 from deleted where 状态<>'已完成'; 9 open @mycursor; 10 fetch next from @mycursor into @order,@name; 11 while(@@fetch_status=0) 12 begin 13 update 编程人员 set 未完成=未完成-1 where 姓名=@name; 14 update 模具信息 set 未完成=未完成-1 where 令号=@order; 15 fetch next from @mycursor into @order,@name; 16 end 17 close @mycursor 18 19 /**插入时执行**/ 20 set @mycursor=cursor for select 令号,编程 from inserted where 状态<>'已完成'; 21 open @mycursor 22 fetch next from @mycursor into @order,@name; 23 while(@@fetch_status=0) 24 begin 25 update 编程人员 set 未完成=未完成+1 where 姓名=@name; 26 update 模具信息 set 未完成=未完成+1 where 令号=@order; 27 fetch next from @mycursor into @order,@name; 28 end 29 close @mycursor 30 deallocate @mycursor
浙公网安备 33010602011771号