【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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM