- ---触发器 一种特殊的存储过程,触发器主要是通过事件进行触发被自动调用执行的。而存储过程可以通过存储过程的名称被调用
- --触发器是当对某一个表进行操作。诸如:update、insert、delete这些操作的时候,系统会自动调用执行该表上对应的触发器
- --SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、alter、drop语句。
- --DML 触发器分为
- --1、 after触发器(之后触发)
- -- a、 insert触发器
- -- b、 update触发器
- -- c、 delete触发器
- --PS:其中after触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上
- -- 2、 instead of 触发器 (之前触发)
- --PS:而instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义
- --触发器有两个特殊的表:插入表(instered表)和删除表(deleted表)。这两张是逻辑表也是虚表。
- --有系统在内存中创建者两张表,不会存储在数据库中。而且两张表的都是只读的,只能读取数据而不能修改数据。
- --这两张表的结果总是与被改触发器应用的表的结构相同。当触发器完成工作后,这两张表就会被删除。
- --Inserted表的数据是插入或是修改后的数据,而deleted表的数据是更新前的或是删除的数据。
- --create trigger trg_name
- --on table_name
- --with encryption --加密触发器
- -- for update......
- --as
- -- Transact-SQL
- ---创建Insert插入类型触发器
- if(OBJECT_ID ('trg_insert','tr')is not null)
- drop trigger trg_insert
- go
- create trigger trg_insert
- on student2
- for insert --插入触发 (向student2插入记录,会插入相同的name 到student 表中)
- as
- --定义变量
- declare @id int,@name varchar(20),@sex int;
- select @idid=id,@namename=name from inserted;--从inserted 表中取出插入的记录
- set @name=@name+CONVERT(varchar,@id);
- insert into student values(@name,1,'ddd',GETDATE (),GETDATE (),GETDATE ());
- print 'student添加学生成功'
- go
- --测试
- insert into student2 values('insertName',1,'insertClass')
- select * from student2
- select * from student
- ---- 创建删除类型触发器
- if(OBJECT_ID ('tgr_delete','tr')is not null)
- drop trigger tgr_delete
- go
- create trigger [dbo].[tgr_delete]
- on [dbo].[student2]
- for delete --将删除student2的记录,存入到另张表中
- as
- print '备份数据中'
- if(object_id('student2BackUp','U')is not null )
- insert into student2BackUp select name,sex ,class from deleted --从deleted表中取出删除的表
- else
- select * into student2BackUp from deleted
- print '备份数据成功'
- go
- --测试
- delete student2 where id=3
- select * from student2
- select * from student2BackUp
- --创建update类型的触发器
- if(OBJECT_ID ('tgr_update','tr')is not null)
- drop trigger tgr_update
- go
- create trigger [dbo].[tgr_update]
- on [dbo].[student2] ---将student2中更新的记录级联更新到student表中(若student表中存在对应的记录)
- for update
- as
- declare @oldName varchar(20),@newName varchar(20)
- --更新前的数据
- select @oldName =name from deleted--从deleted表中取删除的老名字
- print @oldName
- if(exists(select * from student where name like '%'+@oldName+'%'))
- begin
- select @newName=name from inserted --从inserted表中取出更新后的新名字
- update student set name=REPLACE (name,@oldName ,@newName )
- where name like '%'+@oldName +'%'
- print '级联修改数据成功'
- end
- else
- print '无需修改student表'
- GO
- --测试
- update student2 set name='updateName' where id=4
- select * from student2
- select * from student
- ---创建instead of 触发器
- if(OBJECT_ID ('tgr_insteadOf','tr')is not null)
- drop trigger tgr_insteadOf
- go
- create trigger [dbo].[tgr_insteadOf]
- on [dbo].[student2]
- instead of delete --update ,insert
- as
- declare @name varchar(20)
- select @namename=name from deleted
- delete student where name=@name
- print 'name'+@name+'删除成功!'
- go
- --测试
- select * from student2
- select * from student
- delete student2 where id=19
- select * from student2
- select * from student --其实只删除了student表中的记录
- --创建updatecolumn类型触发器
- if(OBJECT_ID ('tgr_update_column','tr')is not null)
- drop trigger tgr_update_column
- go
- create trigger [dbo].[tgr_update_column]
- on [dbo].[student2]
- for update
- as
- if(update(sex))
- begin
- raisError('性别不能随意设置',16,11)
- rollback tran
- end
- GO
- --测试
- update student2 set sex=1 where sex is null
- ---删除触发器
- drop trigger trigger_name
- --查看数据库中已有触发器
- select * from sysobjects where xtype='tr'
- --查看单个触发器 (定义的文本)
- exec sp_helptext 'trg_insert' --‘触发器名’
- --修改触发器
- alter trigger trigger_name
- on {table_name | view_name}
- {for | After | Instead of }
- [ insert, update,delete ]
- as
- sql_statement
PS: 一个表或视图的每一个修改动作(insert,update和delete)都可以有一个instead of 触发器﹐一个表的每个修改动作都可以有多个After触发器。