1.触发器的作用?
触发器是一个特殊的存储过程,当对指定的表进行某种特定操作(如:Insert,Delete或Update)时,触发器产生作用。触发器可以调用存储过程。
触发器的限制:
一个表最多只能有三个触发器,insert,update,delete
每个触发器只能用于一个表
不能对视图、临时表创建触发器
Truncate table能删除表,但不能触发触发器
不能将触发器用于系统表
常见的触发器有三种:分别应用于Insert,Update,Delete事件。
instead of 触发器
创建一个instead of 触发器
if exists(select * from sysobjects where name='trig_inser') --触发器名称
drop trigger trig_inser
go
create trigger trig_inser on Employee instead of insert
as
declare @Name nvarchar(50), @Gender nvarchar(50)
declare @Salary decimal(10,2)
select @Name=Name,@Gender=Gender,@Salary=Salary from inserted
if @Gender='男' and @Salary<=2300.00 --判断条件
begin
print'性别男的,工资需要大于2300'
end
else
begin
print'进行添加'
insert Employee(Name,Gender,Salary) values(@Name,@Gender,@Salary)
end
go
创建成功后可以在表的触发器文件夹下找到你创建的触发器。
sql语句执行后触发 触发器 进行判断成立后进行添加操作,不成立提示错误信息
sql语句执insert Employee(Name,Gender,Salary) values('lily12222111','男',2000.00)
如果条件成立则提示进行添加 ,创建成功
insert Employee(Name,Gender,Salary) values('王','男',2300.00)
after触发器
if exists(select * from sysobjects where name='trig_inser2')
drop trigger trig_inser2
go
create trigger trig_inser2 on Employee after insert --和instead of 触发器区别
as
declare @Name nvarchar(50), @Gender nvarchar(50)
declare @Salary decimal(10,2)
select @Name=Name,@Gender=Gender,@Salary=Salary from inserted
if @Gender='男' and @Salary<=2300.00
begin
print'性别男的,工资需要大于2300'
rollback transaction --回滚
end
else
begin
print'进行添加'
end
go
after触发器和instead of 触发器 的区别在于执行的先后顺序,after触发器执行sql语句是先执行语句,后进行判断,条件不成立时回滚语句,成立时进行保存数据
insert Employee(Name,Gender,Salary) values('lily12222111','男',2000.00)
什么是存储过程?用什么来调用?
无参数存储过程
创建一个无参数的存储过程
if exists(select * from sysobjects where name='proc_ArticleComment')
drop procedure proc_ArticleComment --存储过程名称
go
--判断是否存在如果存在删除它
create procedure proc_ArticleComment
as
select CommentID ,ar.ArticleID ,l.LikeID ,l.CreateDate,ContentDesc ,ar.CreateDate,c.CustomerName,c.LoginName,c.LoginPassword,c.Sex,c.CreateDate
from ArticleComment ar,ArticleLike l,Customer c
where ar.ArticleID=l.ArticleID and ar.CommentID=c.CustomerID
调用存储过程
exec proc_ArticleComment
方法简单,成功后省略了连表查询的繁琐,简单创建多次调用。
有参数的存储过程
创建一个有参数的存储过程
if exists(select * from sysobjects where name='proc_ArticleComment2')
drop procedure proc_ArticleComment2 --存储过程名称
go
--判断是否存在如果存在删除它
create procedure proc_ArticleComment2(
@LoginName nvarchar(50)
)
as
select CommentID ,ar.ArticleID ,l.LikeID ,l.CreateDate,ContentDesc ,ar.CreateDate,c.CustomerName,c.LoginName,c.LoginPassword,c.Sex,c.CreateDate
from ArticleComment ar,ArticleLike l,Customer c
where ar.ArticleID=l.ArticleID and ar.CommentID=c.CustomerID and c.LoginName=@LoginName
go
调用存储过程,调用时需要对你说明的变量进行传参,多个参数用逗号隔开。
exec proc_ArticleComment2 ' KenshinCui'