触发器

触发器(Trigger)

概念

触发器(trigger)是 SQL Server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,当对一个表进行操作(insert,delete,update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。

触发器与存储过程的区别

触发器与存储过程的区别是运行方式的不同,触发器不能执行 EXECUTE 语句调用,而是在用户执行 Transact-SQL 语句时自动触发执行,而存储过程需要用户、应用程序或者触发器来显式地调用并执行。

触发器的优点

  1. 触发器是自动的。当对表中的数据做了任何修改之后立即被激活。
  2. 触发器可以通过数据库中的相关表进行层叠修改。
  3. 触发器可以强制限制。这些限制比用 CHECK 约束所定义的更复杂。与 CHECK 约束不同的是,触发器可以引用其他表中的列。

创建触发器的语法

CREATE TRIGGER trigger_name
 ON table_name
 [WITH ENCRYPTION]
  FOR | AFTER | INSTEAD OF [DELETE, INSERT, UPDATE]
 AS 
  T-SQL语句
GOCode language: PHP (php)

创建学生表

create table student(
    stu_id int identity(1,1) primary key,
    stu_name varchar(10),
    stu_gender char(2),
    stu_age int
)

创建 INSERT 触发器

create trigger trig_insert
on student
after insert
as
begin
    if object_id(N'student_sum',N'U') is null
        create table student_sum(stuCount int default(0));
    declare @stuNumber int;
    select @stuNumber = count(*) from student;
    if not exists (select * from student_sum)
        insert into student_sum values(0);
    update student_sum set stuCount = @stuNumber;
endCode language: JavaScript (javascript)

测试触发器:

insert into student(stu_name,stu_gender,stu_age) values('吕布','男',30);
select stuCount 学生总人数 from student_sum;    

insert into student(stu_name,stu_gender,stu_age) values('貂蝉','女',30);            
select stuCount 学生总人数 from student_sum;

insert into student(stu_name,stu_gender,stu_age) values('曹阿瞒','男',40);                
select stuCount 学生总人数 from student_sum;Code language: JavaScript (javascript)

禁止插入触发器

create trigger insert_forbidden
on student_sum
after insert
as
begin
    RAISERROR('禁止直接向该表中插入记录,操作被禁止',1,1)
    rollback transaction
endCode language: JavaScript (javascript)
insert student_sum (stuCount) values(5);

创建 DELETE 触发器

create trigger trig_delete
on student 
after delete
as
begin
    select stu_id as 已删除的学生编号, stu_name, stu_gender, stu_age
    from deleted
endCode language: JavaScript (javascript)
delete from student where stu_id=1;Code language: JavaScript (javascript)

创建 UPDATE 触发器

create trigger trig_update
on student
after update
as
begin
    declare @stuCount int;
    select @stuCount = count(*) from student;
    update student_sum set stuCount = @stuCount;
    select stu_id as 更新前学生编号, stu_name as 更新前学生姓名 from deleted
    select stu_id as 更新后学生编号, stu_name as 更新后学生姓名 from inserted
endCode language: PHP (php)
update student set stu_name='张飞' where stu_id=2;Code language: JavaScript (javascript)

创建 INSTEAD OF 触发器

create trigger trig_insteadOf
on student 
instead of insert
as 
begin
    declare @stuAge int;
    select @stuAge = (select stu_age from inserted)
    if(@stuAge > 120)
        select '插入年龄错误' as '失败原因'
endCode language: JavaScript (javascript)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注