【sql】使用触发器

今天在写sql触发器时遇到这样一个问题:

  利用完整性规则创建教师表,包括(教师工号,姓名,性别,职称,工资),在此基础上定义触发器,为教师表Teacher定义完整性规则“教授的工资不能低于4000元,如果低于4000元,自动改为4000元”。

 

教师表:

create table teacher(
    tno char(9) primary key,
    tname varchar(15),
    tsex char(2),
    job varchar(20),
    tmoney int
)

 

错误代码:

在触发器中不能写形如inserted.xx的格式,正确写法是用select选出要使用的变量。可以插入多条语句,但是插入的时候是一条一条插的,所以执行时刻inserted表内应该只有一条语句。

正确写法:

create trigger tri2 on teacher
instead of insert 
as 
if ((select tmoney from inserted) < 4000 and (select job from inserted) = '教授')
    insert into teacher values((select tno from inserted), (select tname from inserted), (select tsex from inserted), '教授', 4000)
else
    insert into teacher select * from inserted

 

也可以用变量:

create trigger tri
on teacher
after insert,update
as
begin
    declare @salary int, @jobb varchar(10)
    set @salary=(select tmoney from inserted)
    set @jobb = (select job from inserted)
    if(@salary<4000 and @jobb='教授')
        update teacher set tmoney=4000 where tno=(select tno from inserted)
end

 

还可以索性这样写:

create trigger tri3 on teacher
for insert, update
as
    update teacher
    set tmoney = 4000 
    where job = '教授' and tmoney < 4000

 

 

  定义触发器,当对表SC的Grade属性进行修改时,则将此次操作记录到另一个表SC_U(Sno、Cno、Oldgrade、Newgrade)中,其中Oldgrade是修改前的分数,Newgrade 是修改后的分数。

create trigger tri 
on sc
after update
as 
if update(grade)
begin
create table sc_u(
    sno char(9),
    cno char(1),
    oldgrade int,
    newgrade int
)
insert into sc_u(sno, cno, oldgrade, newgrade)values
((select sno from deleted), (select cno from deleted), (select grade from deleted), (select grade from inserted))
end

 

 

参考博客:

instead of 和 after触发器的区别:

https://bbs.csdn.net/topics/300074591

posted @ 2018-11-01 17:56  LesRoad  阅读(1743)  评论(0编辑  收藏  举报