天天看点

触发器的基本使用

EXISTS()在触发器中比较常用 用来判断有无返回查询的数据行 如果有 返回true 否则 false

有三种触发器 1.是for触发器

2.是after触发器: for触发器属于after触发器 所以基本上直接用after触发器就好了

3.before触发器

4.instead of触发器

after触发器后面可以跟insert,update,delete等简单的操作,意思就是说 当发生了insert,update,delete的sql语句后 就会触发事件 执行某个事件 接下来看一下实例;

两张表之间的联系:  当插入users表一条数据的时候  系统自动往insertRecord插入数据
create trigger
mytrigger
on Users
after insert     AFTER 指定触发器仅在触发 SQL 语句中指定的所有操作都已成功执行时才被触发
as
insert into InsertRecord(UserName,Age,Gender,[Address]) select UserName,Age,Gender,[Address] from inserted

insert into Users(UserName,Age,Gender,[Address]) values('关晓彤1','19','女','北京');             触发器在Users这里  所以执行这个操作才可以执行上面那个插入语句


这是当对 users进行更新的时候   会往UpdateRecord插入数据
create trigger
mytrigger1
on Users
after update
as
insert into UpdateRecord(UserName,Age,Gender,[Address]) select UserName,Age,Gender,[Address] from deleted;
这里为什么不用 values  因为  这是数据迁移  从一张表上迁移到另一张表 而values是插入数据里面放的是数据  而  select存放的是字段
//字段和关键字重名要用[]括起来   不然会报错

update Users set Age=20 where UserName='关晓彤';   insert 和update先后顺序不要紧           
instead of触发器:

create trigger
mytrigger2
on Users
instead of insert
as
if
datename(week,getdate()) in ('星期六','星期天') or (datepart(hour,getdate()) not  between 9 and 15)              //datename是函数返回 某一结果 getdate()返回字符串
begin
print '非工作时间,不允许插入数据';
rollback;
end

insert into Users (UserName,Gender) values('张三丰','男');

alter table Users enable trigger mytrigger;        //enable是启用    名叫mytrigger的触发器 
DISABLE则相反
           

总结:

1.after insert等 意思就是说在执行after操作后 执行指定的操作

2.before insert等 意思实在执行insert操作之前执行操作 比如删除主键的前提要先删除对应的外键,所以得用before触发器

3.instead of触发器是包涵判断条件的。

4.INSTEAD OF 触发器用来代替通常的触发动作,即当对表进行INSERT、UPDATE 或 DELETE 操作时,系统不是直接对表执行这些操作,而是把操作内容交给触发器,让触发器检查所进行的操作是否正确。如正确才进行相应的操作。

5. 每一个表上只能创建一个 INSTEAD OF 触发器,但可以创建多个 AFTER 触发器。

6. Instead Of 触发器可以进行以下操作:

• 忽略批处理中的某些部分。

•不处理批处理中的某些部分并记录有问题的行。

•如果遇到错误情况则采取备用操作。