当前位置: 首页 > news >正文

sql server 触发器的使用

看数据库下的所有触发器及状态

SELECT a.name 数据表名 ,
sysobjects.name AS 触发器名 ,
sysobjects.crdate AS 创建时间 ,
sysobjects.info ,
sysobjects.status
FROM sysobjects
LEFT JOIN ( SELECT *
FROM sysobjects
WHERE xtype = 'U'
) AS a ON sysobjects.parent_obj = a.id
WHERE sysobjects.xtype = 'TR';

--type的含义
/*
C CHECK 约束
D 默认值或 DEFAULT 约束
F FOREIGN KEY 约束
L 日志
FN 标量函数
IF 内嵌表函数
P 存储过程
PK PRIMARY KEY 约束(类型是 K)
RF 复制筛选存储过程
S 系统表
TF 表函数
TR 触发器
U 用户表
UQ UNIQUE 约束(类型是 K)
V 视图
X 扩展存储过程
*/

--根据触发器名称查询触发器SQL如下

exec sp_helptext  触发器名称

--创建触发器语法

CREATE TRIGGER trigger_nameON table_name[WITH ENCRYPTION]FOR [DELETE, INSERT, UPDATE]AST-SQL语句GO

WITH ENCRYPTION表示加密触发器定义的SQL文本

DELETE, INSERT, UPDATE指定触发器的类型

1.创建insert类型的触发器

插入触发器

--GradeInfo表中插入一条数据,MyStudentInfo表中插入一条记录
IF (object_id('tr_insert','tr') is not null)drop trigger tr_insert
GO
CREATE trigger tr_insert
on GradeInfo
after insert --插入触发
asbegin--定义变量declare @GradeId int--在inserted表中查询已经插入记录信息select @GradeId=id from INSERTED--MyStudentInfo表中插入数据insert INTO MyStudentInfo (GradeId) VALUES (@GradeId)print '插入成功!'end

插入数据

insert INTO GradeInfo VALUES (11,'C++')

查询数据

select * from MyStudentInfo where GradeId=11

2、delete触发器

删除MyStudentInfo表中的数据,插入备份表

--删除MyStudentInfo表中的数据,插入备份表IF (object_id('tr_Delete','tr') is not null)drop TRIGGER tr_DeleteGOCREATE trigger tr_Deleteon MyStudentInfofor deleteasbeginprint '正在备份数据......'IF (object_id('MyStudentInfo_Back','U') is not null)--存在表,直接插入数据insert INTO MyStudentInfo_Back SELECT * from DELETEDelseselect * into MyStudentInfo_Back from DELETEDPRINT '备份完成'end

删除前查询MyStudentInfo表数据

select * from MyStudentInfo

删除id=9的数据

delete FROM MyStudentInfo where Id=9

查询备份表数据

select * from MyStudentInfo_Back

3、update触发器

IF (object_id('tr_Update','tr') is not null)drop TRIGGER tr_UpdateGOCREATE trigger tr_Updateon MyStudentInfofor updateasbegin--声明变量,存储更新前和更新后的姓名declare @OldName varchar(16),@NewName varchar(16)select @OldName=name from DELETEDprint '更新前姓名:'+@OldNameselect @NewName=name from INSERTEDprint '更新后姓名:'+@NewNameend

把张三更新为"张三测试"

update MyStudentInfo SET Name='张三测试' where Id=1

update更新列级触发器

--update更新列级触发器IF (object_id('tr_update_column','tr') is not null)drop TRIGGER tr_update_columnGOCREATE trigger tr_update_columnon GradeInfofor updateasbeginIF(update(id))beginprint '系统提示:主键ID不能更新'rollbackendend

更新id列

update GradeInfo SET Id=15 where Id=4

4、instead of触发器

instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身的内容,其优先级高于定义的SQL语句的执行

语法:

create trigger tgr_name
on table_name
with encryptioninstead of update...
asbeginT-SQLend

创建 instead of 触发器

--创建instead of触发器
/*MyStudentInfo表里面插入数据之前,先判断GradeInfo表中是否有对应的班级ID,如果没有,不允许插入,如果存在,则插入 */
IF (object_id('tr_insteadOf','tr') is not null)drop TRIGGER tr_insteadOf
GO
CREATE trigger tr_insteadOf
on MyStudentInfo
instead of insert
asbeginIF exists(SELECT * FROM GradeInfo WHERE Id=(SELECT GradeId FROM INSERTED))print '该班级存在,可以插入'elsebeginprint '该班级不存在,不可以插入'rollbackendend

测试1,插入不存在的班级id

insert INTO MyStudentInfo (GradeId) VALUES (15)

测试2,插入存在的班级id

insert INTO MyStudentInfo (GradeId) VALUES (5)

DDL触发器

create trigger tr_DDL on databasefor DROP_TABLE,ALTER_TABLEasbeginprint '别想着删库!好好打你的代码'rollback --回滚end

测试删除表

drop TABLE MyStudentInfo

测试修改表结构

alter table MyStudentInfo
alter column Name varchar(32)

删除触发器

drop trigger 触发器名称

禁用DML触发器

disable trigger tr_insteadOf on MyStudentInfo

启用DML触发器

enable trigger tr_insteadOf on MyStudentInfo

禁用DDL触发器

disable trigger tr_DDL on database

启用DDL触发器

enable trigger tr_DDL on database
http://www.lryc.cn/news/171939.html

相关文章:

  • 使用亚马逊云服务器在 G4 实例上运行 Android 应用程序
  • Direct3D融合技术
  • 【计算机网络】信号处理接口 Signal API(1)
  • 贝叶斯滤波计算4d毫米波聚类目标动静属性
  • 华为hcie认证考试怎么考?
  • vue +element 删除按钮操作 (删除单个数据 +删除页码处理 )
  • 更新GitLab上的项目
  • K8S群集调度
  • 完美解决Echarts X坐标轴下方文字最后一个字体加粗颜色加深的问题
  • WebGL 计算平行光、环境光下的漫反射光颜色
  • 解决SpringMVC在JSP页面取不到ModelAndView中数据
  • Spring 6.0 新特性
  • 计算机竞赛 深度学习+opencv+python实现昆虫识别 -图像识别 昆虫识别
  • 软件过程能力成熟度评估——CSMM认证
  • 学内核之二十一:系统调用栈结构分析
  • 互联网3.0 数字原生——数物虚实多维细粒度泛在融合
  • 实现AIGC更好的数据存力,这家科技巨头为我们指明了方向
  • 企业如何在抖音上搞到TOB潜在精准客户流量?
  • JeecgBoot v3.5.5 版本发布,性能大升级版本—开源免费的低代码开发平台
  • 与树上边权、连通块、二分块相关的问题(抓住各连通块之间的联系,考虑增量):CF444E
  • 解决VSCode下载速度很慢
  • 悬赏算命测算源码可以用二维码收款 可以直接拿来运营
  • 在Linux中安装nginx-1.20.1+php-7.4.28(增加扩展)
  • 使用vue-cli搭建SPA项目
  • PLC串口通讯和通讯接口知识汇总
  • Vue基础入门---详细简介
  • Qt重写QTreeWidget实现拖拽
  • 【Spring Boot】拦截器学习笔记
  • 云可观测性:提升云环境中应用程序可靠性
  • 免杀对抗-java语言-shellcode免杀-源码修改+打包exe