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

SQL-触发器(trigger)的详解以及代码演示

一、触发器的概念

触发器是一种特殊的存储过程,但是触发器不存在输入和输出参数,所以不能被显式的去调用,而是与特定的表相关联,当表中的数据发生变化时,触发器被激活并执行其定义的SQL代码。触发器可以是行级触发器(针对每一行数据变化)或语句级触发器(针对整个SQL语句的变化),行级触发器允许对每一行单独处理,而语句级触发器则在整个操作完成后执行一次。

触发器的功能

  1. 强化约束:触发器能够实现比CHECK语句更为复杂的约束。它可以很方便地引用其他表的列,进行逻辑上的检查。
  2. 跟踪变化:触发器可以检测数据库内的操作,从而禁止数据库中未经许可的更新和变化,以确保输入表中的数据的有效性。
  3. 级联运行:触发器可以检测数据库内的操作,并自动地级联影响整个数据库的不同表的各项内容。
  4. 调用存储过程:为了响应数据库更新,可以调用一个或多个触发器。

二、触发器种类及分类

触发器主要分为DML触发器和DDL触发器两种。

  1. DML触发器:用户通过数据操作语句DML(对表或视图的INSERT、DELETE、UPDATE)编辑数据,则执行DML触发器。DML触发器可以在记录变更前(INSTEAD OF)或记录变更后(AFTER)被触发。

    • AFTER触发器:在记录已经被修改完,事务已提交后被触发执行。主要用于记录变更后的处理或检查。(比如在订单系统中,当订单金额超过某个阈值时,需要进行额外的校验,如检查客户的信用额度。就可以在订单表被插入或更新时,检查订单金额是否超过阈值,并进行相应的校验操作。)
    • INSTEAD OF触发器:不去执行其定义的操作(INSERT、UPDATE、DELETE),而是交给触发器执行。触发器检查操作是否正确,若正确则执行操作。这类触发器用来取代原本的操作,在记录变更之前被触发。(比如插入一条问卷数据后,执行你的逻辑业务,比如对根据问卷数据中的答案统计出反馈指标插入到反馈表中)
  2. DDL触发器:为了响应各种数据定义语言DDL(如CREATE、ALTER、DROP)事件而激发。DDL触发器可以用于在数据库执行管理任务。

三、触发器语法(T-SQL)

1. 创建DML触发器
CREATE TRIGGER 触发器名称  
ON { table | view }  
{ FOR | AFTER | INSTEAD OF }  
{ [ INSERT ] | [ UPDATE ] | [ DELETE ] }  
AS  
SQL语句


举例

AFTER触发器:修改student表数据后,查询修改后的数据。

CREATE TRIGGER trig_student_After  
ON student  
FOR UPDATE  
AS  
PRINT 'THE TRIGGER IS AFTER'  
SELECT * FROM student
 2. 创建DDL触发器
CREATE TRIGGER 触发器名称  
ON { ALL SERVER | DATABASE }  
{ FOR | AFTER }  
{ 事件类型 | 事件组 }  
AS  
SQL语句

举例:创建数据库后输出提示信息。

CREATE TRIGGER trig_create  
ON ALL SERVER  
AFTER CREATE_DATABASE  
AS  
PRINT '创建数据库'
3. 修改触发器

修改DML或DDL触发器时,可以将CREATE关键字修改为ALTER

ALTER TRIGGER 触发器名称  
ON { table | view | ALL SERVER | DATABASE }  
{ FOR | AFTER | INSTEAD OF }  
{ [ INSERT ] | [ UPDATE ] | [ DELETE ] | 事件类型 | 事件组 }  
AS  
SQL语句
4. 删除触发器
DROP TRIGGER 触发器名称
5.使用系统存储过程查看触发器
  • sp_helptrigger                                                                                                      sp_helptrigger 存储过程用于返回与指定表或视图关联的触发器的信息。

    EXEC sp_helptrigger 'your_table_or_view_name';
  • sp_helptext

    sp_helptext 存储过程用于返回指定数据库对象的定义文本,包括触发器、存储过程、视图等。

    EXEC sp_helptext 'your_trigger_name';

    这将返回指定触发器的定义文本,包括触发器的CREATE语句。

  • sys.triggers 和 sys.trigger_events

    虽然这些不是存储过程,但它们是系统视图,提供了关于触发器及其事件的详细信息。你可以查询这些视图来获取触发器的各种属性。

    SELECT   t.name AS TriggerName,  t.parent_id AS ParentObjectID,  OBJECT_NAME(t.parent_id) AS ParentObjectName,  te.type_desc AS TriggerType,  te.event_type_desc AS EventType  
    FROM   sys.triggers t  
    INNER JOIN   sys.trigger_events te ON t.object_id = te.object_id;

    这个查询将返回触发器的名称、父对象(表或视图)的名称、触发器的类型(如AFTER、INSTEAD OF)以及触发事件(如INSERT、UPDATE、DELETE)。

  • sys.sql_modules

    sys.sql_modules 视图包含数据库中所有用户定义对象(如触发器、存储过程、函数等)的SQL定义。你可以通过查询这个视图来获取触发器的完整定义。

    SELECT   m.definition AS TriggerDefinition,  o.name AS TriggerName  
    FROM   sys.sql_modules m  
    INNER JOIN   sys.objects o ON m.object_id = o.object_id  
    WHERE   o.type = 'TR' -- 'TR' 表示触发器  AND o.name = 'your_trigger_name'; -- 可选,用于指定触发器名称

    这个查询将返回指定触发器的完整定义文本。如果不指定触发器名称,它将返回所有触发器的定义。

  • INFORMATION_SCHEMA.TRIGGERS

    INFORMATION_SCHEMA.TRIGGERS 视图提供了关于数据库中触发器的标准信息。然而,它可能不包含触发器的完整定义或某些特定于SQL Server的属性。

    SELECT   TRIGGER_NAME,  EVENT_MANIPULATION,  EVENT_OBJECT_TABLE,  ACTION_STATEMENT_TYPE,  ACTION_TIMING  
    FROM   INFORMATION_SCHEMA.TRIGGERS  
    WHERE   TRIGGER_SCHEMA = 'your_schema_name'; -- 可选,用于指定架构名称

    这个查询将返回触发器的名称、触发事件类型、触发对象表名、动作语句类型以及动作时机(如BEFORE或AFTER,但注意SQL Server中通常是AFTER或INSTEAD OF)。

6.禁用触发器
  • DDL
    /** 禁用 */
    DISABLE TARRGER DDL_TRG_NAME ON DATABASE
    GO/** 启用 */
    ENABLE  TARRGER DDL_TRG_NAME ON DATABASE
    GO
  • DML
    /** 禁用 **/
    ALTER TABLE TableNanme DISABLE TRIGGER DML_TRG_NAME
    GO/** 启用 **/
    ALTER TABLE TableNanme ENABLE TRIGGER DML_TRG_NAME
     

 

相关文章:

SQL-触发器(trigger)的详解以及代码演示

一、触发器的概念 触发器是一种特殊的存储过程,但是触发器不存在输入和输出参数,所以不能被显式的去调用,而是与特定的表相关联,当表中的数据发生变化时,触发器被激活并执行其定义的SQL代码。触发器可以是行级触发器&…...

【devops】x-ui 实现一键安装 x-ray 打造高速国际冲浪 | xray管理平台

一、部署X-UI篇 1、Github 地址&说明 github地址如下: https://github.com/FranzKafkaYu/x-ui?tabreadme-ov-file 2、一键部署 2.1、更新并安装curl #Ubuntu、Deibian系统 apt update && apt upgrade -y apt install curl -y #CentOS7 系统 yum…...

Linux系统编程——进程标识、进程创建

一、进程标识(pid) 每个进程都有一个非负整数形式的唯一编号,即 PID。PID 在任何时刻都是唯一的,但是可以重用,当进程终止并被回收以后,其 PID 就可以为其它进程所用。进程的 PID 由系统内核根据延迟重用算…...

【超级福利】openMind开源实习来袭,奖励高达万元,解锁你的AI实践新篇章!

亲爱的小伙伴们,是不是梦想着能在真实的项目中大展拳脚,却又苦于找不到合适的舞台?别担心,OpenI启智社区携手openMind Library工具链,为你量身打造了一场开源实习盛宴,保证让你的学习不再无聊,技…...

React JSX 使用条件语句渲染UI的两种写法

只针对函数组件 1. 第一种写法&#xff1a; function App({ id }) {return id1? <h1>hello</h1> : <h1>world</h1>; } 或者&#xff1a; function App({ id }) {return (<h1>{id1 && "hello" || id2 && "wo…...

谷歌-BERT-第四步:模型部署

1 需求 需求1&#xff1a;基于gradio实现大模型的WEB UI交互界面 2 接口 3 示例 import gradio as gr from transformers import *classifier pipeline("text-classification", model"./model", tokenizer"./model")gr.Interface.from_pipel…...

猫咪化身蒲公英,浮毛满屋乱飞,有哪些宠物空气净化器值得购买?

不掉毛的猫咪究竟是谁在养&#xff1f; 当初去朋友家玩&#xff0c;被猫咪捕获芳心&#xff0c;没多久自己也领养了一只。没想到啊&#xff0c;这就意味着要和猫毛纠缠一辈子了。平时白天上班不在家&#xff0c;它就在一边跑动一边掉毛&#xff0c;回到家我都能推断它的行动路…...

端到端的开源OCR模型:GOT-OCR-2.0,支持场景文本、文档、乐谱、图表、数学公式等内容识别!

今天给大家分享一个端到端的开源 OCR 模型&#xff0c;号称 OCR 2.0&#xff01; 支持场景文本、文档、乐谱、图表、数学公式等内容识别&#xff0c;拿到了 BLEU 0.972 高分。 从给出的演示图来看&#xff0c;一些非常复杂的数学公式都能正确的识别&#xff0c;颇为强大。模型…...

自注意力机制self-attention中QKV矩阵的含义

自注意力机制&#xff08;Self-Attention&#xff09;是Transformer模型的核心组件&#xff0c;其中Q、K、V矩阵分别代表查询&#xff08;Query&#xff09;、键&#xff08;Key&#xff09;、值&#xff08;Value&#xff09;。它们的作用和含义可以通过信息匹配过程来理解。在…...

【前端】Bootstrap:栅格系统 (Grid System)

Bootstrap的栅格系统是该框架的核心部分之一&#xff0c;能够让开发者轻松创建响应式网页布局&#xff0c;适配各种屏幕尺寸和设备。栅格系统通过将页面划分为12列的布局结构&#xff0c;开发者可以根据内容的重要性和设计需求灵活控制元素的宽度和排列。 在这篇文章中&#x…...

一文读懂,SSL证书怎么验签安装使用?

SSL证书目前已经有越来越多的企业网站开始使用&#xff0c;安装SSL证书后&#xff0c;原有的http协议将会变成安全性更好的https加密协议&#xff0c;这对保护用户的信息安全&#xff0c;保障企业及用户的利益起着重要作用。 一张SSL证书的获取&#xff0c;需要经历不少环节&a…...

Mysql(八) --- 视图

文章目录 前言1.什么是视图&#xff1f;2.创建视图3. 使用视图4. 修改数据4.1.注意事项 5. 删除视图6.视图的优点 前言 前面我们学习了索引&#xff0c;这次我们来学习视图 1.什么是视图&#xff1f; 视图是一个虚拟的表&#xff0c;它是基于一个或多个基本表或其他视图的查询…...

SQL注入原理、类型、危害与防御

SQL注入的原理概念 SQL注入是一种常见的网络攻击技术&#xff0c;攻击者通过在Web应用程序的输入字段中注入恶意构造的SQL代码&#xff0c;以欺骗后端数据库执行非预期的SQL命令。这种攻击可以导致数据泄露、权限提升、数据篡改甚至系统瘫痪。SQL注入可以分为多种类型&#xf…...

第2讲 数据库系统的结构抽象与演变

基本内容 数据库系统的标准结构?数据模型?数据库系统的演变与发展?重难点 一组概念的区分:三级模式两层映像,物理独立性和逻辑独立性一组概念的区分:数据→模式→数据模型几种数据模型的差异:网状/层次模型→关系模型→数据模型数据库系统的标准结构 (1)数据库系统的分…...

Git创建开发分支命名规则

git checkout -b feature/branchname 和 git checkout -b branchname 这两条命令的主要区别在于新分支的命名。 主要区别 分支命名&#xff1a; git checkout -b feature/branchname&#xff1a;新分支的名字是 feature/branchname&#xff0c;表示该分支属于一个特性开发&…...

【纯前端excel导出】vue2纯前端导出excel,使用xlsx插件,修改样式、合并单元格

一、使用第三方插件 1、安装 npm install xlsx-js-style 2、引入 import xlsx from xlsx-js-style xlsx插件是基础的导出&#xff0c;不可以修改样式&#xff0c;直接xlsx-style插件式修改样式的&#xff0c;所以这里直接用二者合体插件即可 二、页面使用 1、数据源 [{"…...

如何在极速浏览器中实现谷歌浏览器的扩展功能

在当今数字化时代&#xff0c;浏览器扩展功能极大地增强了我们的在线体验。尤其是谷歌浏览器&#xff0c;以其丰富的扩展生态而闻名。但是&#xff0c;如果你想在极速浏览器中使用这些谷歌浏览器的扩展功能&#xff0c;该怎么办呢&#xff1f;本文将为你详细解析如何实现这一目…...

Web安全 - 跨站点请求伪造CSRF(Cross Site Request Forgery)

文章目录 OWASP 2023 TOP 10CSRF 导图CSRF的基本概念CSRF的工作原理常见CSRF攻击模式CSRF防御策略补充建议应用场景实战防御策略选择1. CSRF Token&#xff08;首选&#xff09;2. SameSite Cookie属性3. 验证Referer和Origin4. 多因素认证 实现方案CSRF Token实现SameSite Coo…...

C++游戏开发完整学习路径

C游戏开发完整学习路径 引言 随着游戏行业的迅速发展&#xff0c;C作为主要的游戏开发语言&#xff0c;因其高效性和灵活性&#xff0c;依然受到广泛欢迎。C不仅在大型游戏开发中被广泛使用&#xff0c;而且在游戏引擎的构建、性能优化和复杂算法的实现中也扮演着关键角色。本…...

vue3之 shallowRef、markRaw

shallowRef 用于创建一个浅层响应式引用&#xff0c;只对顶层属性进行响应式处理。 markRaw 用于标记一个对象&#xff0c;使其完全跳过 Vue 的响应式系统。 这两者都可以用于优化性能&#xff0c;避免不必要的响应式开销&#xff0c;特别是在处理大型对象或第三方库对象时。 …...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]

报错信息&#xff1a;libc.so.6: cannot open shared object file: No such file or directory&#xff1a; #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...

JS红宝书笔记 - 3.3 变量

要定义变量&#xff0c;可以使用var操作符&#xff0c;后跟变量名 ES实现变量初始化&#xff0c;因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符&#xff0c;可以创建一个全局变量 如果需要定义…...