(7.1.4)SQL中的触发器trigger

时间:2022-11-08 05:07:10

inserted,deleted是在触发器中使用的两个临时表,当执行insert操作时,在inserted中存储着当前插入的记录,在执行delete操作时,在deleted中存储着当前删除的记录,当执行update时,在inserted中存储着修改后的记录,在deleted中存储着修改前的记录。


建立触发器

        

[sql] view plaincopyprint?
  1. CREATE TRIGGER 触发器名称  
  2. ON 表名  
  3. FOR | AFTER | INSTEAD OF }   
  4. { [ INSERT ] [ , ] [ DELETE ] [ , ]   
  5.    [UPDATE ] }  
  6. AS   
  7.   SQL 语句 [ ... n ]   

        删除触发器:

[sql] view plaincopyprint?
  1. DROP TRIGGER 触发器名 [ , ... n ]  
    修改触发器:

[sql] view plaincopyprint?
  1. ALTER TRIGGER 触发器名称  
  2. ON 表名  
  3. FOR | AFTER | INSTEAD OF }   
  4. { [ INSERT ] [ , ] [ DELETE ] [ , ]   
  5.    [UPDATE ] }  
  6. AS   
  7.   SQL 语句 [ ... n ]   

    开启和禁用:

[sql] view plaincopyprint?
  1. disable trigger trigDB on database --禁用触发器  
  2. enable trigger trigDB on database --开启触发器  
示例

    在S表创建UPDATE触发器:

[sql] view plaincopyprint?
  1. Create trigger tri_Updates  
  2. on s  
  3. for update   
  4. as   
  5. print 'the table s was updated'  

    禁止删除SC表中成绩不及格学生的记录:

[sql] view plaincopyprint?
  1. CREATE TRIGGER tri_del_grade  
  2.   ON SC FOR DELETE  
  3.   AS  
  4.     IF EXISTS(SELECT * FROM DELETED      
  5.           WHERE Grade < 60)  
  6.       ROLLBACK   

   禁止将SC表中不及格学生的成绩改为及格:

[sql] view plaincopyprint?
  1. create trigger tri_update_grade  
  2. on sc for update  
  3. as   
  4.   if update(grade)  
  5.   if exists(select * from inserted,deleted  
  6.   where inserted.sno=deleted.sno and inserted.grade>=60 and deleted.grade<60)  
  7.   begin   
  8.     print '不能将不及格的成绩改为及格'  
  9.   rollback  
  10.   end