sql server 触发器的使用

news2024/11/29 6:30:57

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

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_name

     ON table_name

 [WITH ENCRYPTION]

   FOR [DELETE, INSERT, UPDATE]

 AS

    T-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 --插入触发
as
 begin
   --定义变量
   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_Delete
 GO
 CREATE trigger tr_Delete
 on MyStudentInfo
 for delete
 as
  begin
    print '正在备份数据......'
 IF (object_id('MyStudentInfo_Back','U') is not null)
 --存在表,直接插入数据
   insert INTO MyStudentInfo_Back SELECT * from DELETED
 else
   select * into MyStudentInfo_Back from DELETED
 PRINT '备份完成'
 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_Update
  GO
  CREATE trigger tr_Update
  on MyStudentInfo
  for update
  as
    begin
   --声明变量,存储更新前和更新后的姓名
   declare @OldName varchar(16),@NewName varchar(16)
   select @OldName=name from DELETED
   print '更新前姓名:'+@OldName
   select @NewName=name from INSERTED
   print '更新后姓名:'+@NewName
 end

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

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

update更新列级触发器

--update更新列级触发器
   IF (object_id('tr_update_column','tr') is not null)
      drop TRIGGER tr_update_column
   GO
   CREATE trigger tr_update_column
   on GradeInfo
   for update
   as
     begin
    IF(update(id))
      begin
     print '系统提示:主键ID不能更新'
     rollback
   end
  end

更新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 encryption
    instead of update...
as
    begin
  T-SQL
 end

创建 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
as
  begin
     IF exists(SELECT * FROM GradeInfo WHERE Id=(SELECT GradeId FROM INSERTED))
      print '该班级存在,可以插入'
  else
    begin
      print '该班级不存在,不可以插入'
   rollback
    end
  end

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

insert INTO MyStudentInfo (GradeId) VALUES (15)

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

insert INTO MyStudentInfo (GradeId) VALUES (5)

DDL触发器

create trigger tr_DDL on database
  for DROP_TABLE,ALTER_TABLE
  as
    begin
      print '别想着删库!好好打你的代码'
   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.coloradmin.cn/o/1008196.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Git: 工作区、暂存区、本地仓库、远程仓库

参考链接: Git: 工作区、暂存区、本地仓库、远程仓库 https://blog.csdn.net/weixin_36750623/article/details/96189838

阿里云通义千问向全社会开放,近期将开源更大参数规模大模型

9月13日,阿里云宣布通义千问大模型已首批通过备案,并正式向公众开放,广大用户可登录通义千问官网体验,企业用户可以通过阿里云调用通义千问API。 通义千问在技术创新和行业应用上均位居大模型行业前列。IDC最新的AI大模型评估报告…

腾讯云AI超级底座新升级:训练效率提升幅度达到3倍

大模型推动AI进入新纪元,对计算、存储、网络、数据检索及调度容错等方面提出了更高要求。在9月7日举行的2023腾讯全球数字生态大会“AI超级底座专场”上,腾讯云介绍异构计算全新产品矩阵“AI超级底座”及其新能力。 腾讯云副总裁王亚晨在开场致辞中表示&…

创建第一个MyBatis框架--保姆级教学

文章目录 前言一、创建一个空的mybatis项目二、创建一个Maven模块三、各个文件的配置四、总结 前言 在idea上创建我的第一个MyBatis框架 一、创建一个空的mybatis项目 1、new一个新的项目 2、选择最下面,创建一个空项目 3、为空项目取一个名字,位置可以自己选 4、点…

TCP 和 UDP 的 Socket 调用

在网络层,Socket 函数需要指定到底是 IPv4 还是 IPv6,分别对应设置为 AF_INET 和 AF_INET6。另外,还要指定到底是 TCP 还是 UDP。TCP 协议是基于数据流的,所以设置为 SOCK_STREAM,而 UDP 是基于数据报的,因…

java的集合进阶学习

1.集合类 集合类的特点:提供一种存储空间可变的存储模型,存储的数据容量可以随时发生改变 2.集合体系结构 3.Collection集合 Collection集合常用方法 Collection集合的遍历 4.List集合特点 LinkedList集合的特有功能 数组和链表数据结构 栈&#xff…

数据分析三剑客之Pandas

1.引入 前面一篇文章我们介绍了numpy,但numpy的特长并不是在于数据处理,而是在它能非常方便地实现科学计算,所以我们日常对数据进行处理时用的numpy情况并不是很多,我们需要处理的数据一般都是带有列标签和index索引的&#xff0…

MCU软核 1. Altera FPGA上运行8051

0. 环境 - Quartus 13 - EP4CE6E22开发板 - keil c51 - ag10kl144h(本工程兼容AGM) 下载8051源码:https://www.oreganosystems.at/products/ip-cores/8051-ip-core 1. Create Project File --> New Project Wizard 位置:E…

什么是ELK

什么是ELK ELK 并不是一个技术框架的名称,它其实是一个三位一体的技术名词,ELK 的每个字母都来自一个技术组件,分别是 Elasticsearch(简称 ES)、Logstash 和 Kibana。 三个技术组件是独立的,后两个被elast…

yolov5权重文件.pt转.bin文件

参考链接:YOLOv5学习记录(二): 模型转化及Android端部署_yolo .pt文件转未bin_Xiaoer__Lu的博客-CSDN博客 1、准备pt文件 我的目录是:C:\Users\Administrator\Desktop\driving\yolov5-mask-42-master\runs\train\exp_yolov5s\weights里的best.pt 2、p…

【hive】列转行—collect_set()/collect_list()/concat_ws()函数的使用场景

文章目录 一、collect_set()/collect_list()二、实际运用把同一分组的不同行的数据聚合成一个行用下标可以随机取某一个聚合后的中的值用‘|’分隔开使用collect_set()/collect_list()使得全局有序 一、collect_set()/collect_list() 在 Hive 中想实现按某字段分组&#xff0c…

ARM架构指令集--专用指令

四、状态寄存器专用指令 CPSR寄存器-N Z C V T为0时 为ARM状态 F为0时 为开启FIQ状态 I为0时 为开启IRQ状态 图1 图2 一开始都是SVC指令,因为在操作系统启动的时候,在做一些初始化的操作,不允许被打断 图3 复位后CPSR寄存器为0xD3--…

YOLO物体检测-系列教程4:YOLOV3项目实战1(coco图像数据集/darknet预训练模型)

1、整体项目 1.1 环境 一个有debug功能的IDE,建议PycharmPyTorch深度学习开发环境下载COCO数据集: 训练集,是很大的数据验证集,是很大的数据 1.2 数据 依次进入以下地址: 项目位置\PyTorch-YOLOv3\data\coco\imag…

elasticsearch基础篇

目录 1.mysql与elasticsearch 2.索引库操作 2.1.mapping映射属性 2.2.索引库的CRUD 2.2.1.创建索引库和映射 2.2.2.查询索引库 2.2.3.修改索引库 2.2.4.删除索引库 2.2.5.总结 3.文档操作 3.1.新增文档 3.2.查询文档 3.3.删除文档 3.4.修改文档 3.4.1.全量修改 …

QT6 C++ qDebug()输出中文乱码解决方法

1.“工具”->“选项” 2.“文本编辑器“->”Behaior(行为)“->默认编码修改为UTF-8 3.“编辑”->“Select Encoding”->选择UTF-8 4.再次编译运行,可以输出显示中文

Springboot 集成 Ehcache操作数据库显示SQL语句设置

Springboot 集成 Ehcache操作数据库显示SQL语句设置 2023-09-13 23:33:35.030 INFO 6124 --- [ task-1] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] 2023-09-13 23:33:35.124 INFO 6124 --- [ …

24.Xaml ListView控件-----显示数据

1.运行效果 2.运行源码 a.Xaml源码 <Window x:Class="testView.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mic…

为保障小程序安全,安装SSL证书是必要的选择

随着小程序的蓬勃发展&#xff0c;用户对于安全性和隐私保护的关注也日益增加。在这样的背景下&#xff0c;安装SSL证书成为保障小程序安全的重要措施之一。本文将为您详细介绍安装SSL证书的原因及其带来的益处。 首先&#xff0c;SSL证书可以保护用户数据的安全性。通过为小程…

开源视频监控服务器Shinobi

什么是 Shinobi ? Shinobi 是用 Node.JS 编写的开源 CCTV 解决方案。采用多帐户系统、WebSocket Streams 和直接保存到 MP4 的设计。Shinobi 提供了一个基于 Web 的用户界面&#xff0c;使用户可以通过浏览器来查看和管理监控视频&#xff0c;Shinobi 支持多个品牌的摄像头和网…

【2023】数据挖掘课程设计:基于TF-IDF的文本分类

目录 一、课程设计题目 基于TF-IDF的文本分类 二、课程设计设置 1. 操作系统 2. IDE 3. python 4. 相关的库 三、课程设计目标 1. 掌握数据预处理的方法&#xff0c;对训练集数据进行预处理&#xff1b; 2. 掌握文本分类建模的方法&#xff0c;对语料库的文档进行建模…