今天在寫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觸發器的區別:
