sql数据库中触发器

--创建工资表,要求建立触发器,当插入数据是工资小于的
--修改为,大于的修改为

create table tbl_salary(
empid int not null,
empname varchar(20) not null,
salary int
)
--创建触发器实现上述功能:
create trigger tri_insert on tbl_salary
instead of insert
as
declare @id int,@empname varchar(20),@salary int
select @id=empid,@empname=empname, @salary=salary
       from inserted
if @salary<3000
   set @salary=3000
if @salary>8000
   set @salary=8000
insert into tbl_salary values(@id,@empname,@salary)

--插入数据,验证触发器是否正确使用:
insert into tbl_salary values(1002,'tracy',9800)
insert into tbl_salary values(1004,'kobe',2800)
insert into tbl_salary values(1006,'tom',4800)
select *from tbl_salary

/*
创建两表,建立一个视图基于这两张表。
创建触发器实现向视图插入数据时等于
分别向两表插入数据
*/

--创建表tbl_dept:
create table tbl_dept(
deptid varchar(4) primary key,
deptname varchar(10) not null
)

--创建表tbl_emp:
create table tbl_emp(
empid varchar(10) primary key,
empname varchar(20) not null,
deptid varchar(4) foreign key
references tbl_dept(deptid) 
not null
)

--创建视图用于存储表tbl_dept和tbl_emp表中的数据:
create view v_empinfo 
as 
select 
tbl_emp.empid,tbl_emp.empname,tbl_emp.deptid,
tbl_dept.deptname 
from 
tbl_emp,tbl_dept
where 
tbl_emp.deptid=tbl_dept.deptid
select *from v_empinfo

--创建触发器实现上述功能:
create trigger tr_insert on v_empinfo
instead of insert
as
declare @eid varchar(10),@ename varchar(20),
        @did varchar(4),@dname varchar(10)
select @eid=empid,@ename=empname,
       @did=deptid,@dname=deptname
from 
       inserted
insert into tbl_dept values(@did,@dname)
insert into tbl_emp values(@eid,@ename,@did)

--验证是否成功向两表中插入数据:
insert into v_empinfo values('200911076','tracy',
                             '1001','sales')
select *from tbl_emp
select *from tbl_dept

--创建触发器实现删除主表中的数据时自动删除附表中的数据:

--创建表tbl_stu:
create table tbl_stu(
stuid varchar(15) primary key,
stuname varchar(20) not null
)

--插入数据:
insert into tbl_stu values('200911076','李白和')
insert into tbl_stu values('200911077','王洪洋')

--创建表tbl_score:
create table tbl_score(
stuid varchar(15) 
foreign key 
references tbl_stu(stuid)
not null,
Math int default(0)
)

--插入数据:
insert into tbl_score values('200911076',85)
insert into tbl_score values('200911077',95)

--创建视图v_view:
create view v_view 
as
select 
s.stuid,s.stuname,sc.math
from 
tbl_stu s,tbl_score sc
where
s.stuid=sc.stuid

--为视图创建触发器tr_delete:
create trigger tr_delete on v_view
instead of delete
as
declare @stuid varchar(15),@stuname varchar(20),
        @math int
select @stuid=stuid,@stuname=stuname,@math=math
       from deleted
delete tbl_score where stuid=@stuid
delete tbl_stu where stuid=@stuid

--验证是否删除两表中对应的所有信息
delete v_view where stuid='200911077'
select *from tbl_stu
select *from tbl_score

触发器一般有after,instead of,for 三个类型的触发器,


after是指在触发触发器的操作执行完以后执行触发器内部的操作,after触发器定义了对表执行了 INSERT、UPDATE 或 DELETE 语句操作之后再执行的操作。比如对某个表中的数据进行了更新操作后,要求立即对相关的表进行指定的操作,这时就可以采用 after触发器。after触发器只能在表上指定,且动作晚于约束处理。

每一个表上只能创建一个instead of 触发器,但可以创建多个 after触发器。


for类同与after触发器,


instead of是指不执行触发触发器的操作,只执行触发器内部的操作.instead of触发器用来代替通常的触发动作,即当对表进行INSERT、UPDATE 或 DELETE 操作时,系统不是直接对表执行这些操作,而是把操作内容交给触发器,让触发器检查所进行的操作是否正确。如正确才进行相应的操作。因此,instead of 触发器的动作要早于表的约束处理。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值