SQLServer触发器的创建和使用

本文围绕SQL Server数据库中的触发器展开,介绍了触发器可看作特殊数据库函数,由系统调用。阐述了触发器的主体,包括表、视图、库和服务器,以及不同主体的触发规则。还给出了表/视图触发器和数据库/服务器触发器的语法示例,并对比了AFTER和INSTEAD OF触发器的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

触发器也是和之前写的数据库函数和存储过程类似,
可以看做是一种特殊的数据库函数,只不过由系统调用,我们也需要表明调用的实际和规则

触发器的主体(也可以说是触发器的使用范围)

  • 表table
  • 视图view
  • 库database
  • 服务器server
    按照SQLServer的分类----表/视图触发器称为DML触发器-------数据库/服务器触发器称为DDL触发器

触发器的触发规则(触发的可选条件)

1.对于主体在表和视图的触发器
Trigger on an INSERT, UPDATE, or DELETE statement to a table or view
可以在Insert,Update,delete时触发
不能在Select触发
2.对于主体在数据库和服务器的触发器
Trigger on a CREATE, ALTER, DROP, GRANT, DENY, REVOKE, or UPDATE statement
可以在CREATE, ALTER, DROP, GRANT, DENY, REVOKE,UPDATE时触发

触发器的语法

表/视图触发器的语法
ALTER TRIGGER schema_name.trigger_name   
ON  ( table | view )   
[ WITH <dml_trigger_option> [ ,...n ] ]  
 ( FOR | AFTER | INSTEAD OF )   
 --( FOR | AFTER | INSTEAD OF )代表触发器执行的时机
 --FOR的默认既是AFTER表示在原命令执行后执行
 --INSTEAD OF代表不执行原命令,直接去执行触发器内容
{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }   
--从机修改不执行触发该触发器
[ NOT FOR REPLICATION ]   
AS { sql_statement [ ; ] [ ...n ] | EXTERNAL NAME <method specifier>   
[ ; ] }   
  
<dml_trigger_option> ::=  
    [ ENCRYPTION ]  
    [ <EXECUTE AS Clause> ]  
  
<method_specifier> ::=  
    assembly_name.class_name.method_name 

示例:

测试表

Create table t_student(
Id int IDENTITY(1,1) PRIMARY key,
Name varchar(20),
Birth datetime,
Address varchar(100)
)
INSERT into t_student values('xiaoming','2022-07-07','GuangDong')
INSERT into t_student values('xiaohuang','2022-07-06','FuJian')

AFTER触发器

create trigger TestAfterTrigger 
ON t_student
AFTER UPDATE
AS
BEGIN
	PRINT '修改了一条记录'
END	

请添加图片描述
更新语句正常执行
请添加图片描述
INSTEAD OF触发器

Create Trigger TestTriggerSec
On t_student
INSTEAD OF DELETE
AS
BEGIN
	PRINT '你根本删除不了'
END	

请添加图片描述
再去查询原表
请添加图片描述
指定的记录并没有被删除,即原命令并没有执行
这就是INSTAD OF和AFTER的区别

数据库/服务器触发器的语法
ALTER TRIGGER trigger_name   
ON { DATABASE | ALL SERVER }   
[ WITH <ddl_trigger_option> [ ,...n ] ]  
{ FOR | AFTER } { event_type [ ,...n ] | event_group }   
AS { sql_statement [ ; ] | EXTERNAL NAME <method specifier>   
[ ; ] }  
}   
  
<ddl_trigger_option> ::=  
    [ ENCRYPTION ]  
    [ <EXECUTE AS Clause> ]  
  
<method_specifier> ::=  
    assembly_name.class_name.method_name  

数据库/服务器触发器(DDL触发器)的语法和表/视图触发器几乎一样,
不同在于不能使用INSTAED OF,和触发的规则不一样
示例:

Create Trigger DBTrigger 
On DATABASE 
FOR CREATE_TABLE
AS
	PRINT '你创建了一张表'

请添加图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

罗马苏丹默罕默德

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值