SQL Server 触发器

news2024/10/7 8:28:10

触发器是一种存储数据库过程,当数据库中发生特定事件(如插入、更新或删除操作)时,会自动调用该触发器。审核SQL Server实例的方法有很多,其中一种方法是使用审核触发器,触发器在SQL Server数据库中扮演着关键的角色,是执行业务规则、维护数据完整性和简化重复操作的不可或缺的工具。

SQL触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化时自动生效。触发器可以响应INSERT、UPDATE或DELETE语句,并在这些操作前后执行预定义的操作,如查询其他表、执行复杂的Transact-SQL语句等。触发器的执行不是由程序直接调用,而是由数据库事件触发。它们常用于加强数据完整性约束和业务规则的实现。

触发器的语法通常包括以下几个部分:

  • 触发器名称
  • 触发时机:BEFORE或AFTER,指定触发器在DML操作之前或之后执行
  • 操作类型:INSERT、UPDATE或DELETE,指定触发器响应的操作类型
  • 关联表:指定触发器关联的表名
  • 触发条件:可选,用于指定触发器执行的特定条件
  • 触发器代码:包含实际要执行的SQL语句或逻辑

如何在 SQL Server 中创建触发器

若要在 SQL Server 中创建触发器,请使用由以下元素组成的 CREATE TRIGGER 语句:

  • 触发器名称
  • 关联表
  • 触发事件(INSERT、UPDATE、DELETE 等)
  • 触发器触发时要执行的 SQL 语句
CREATE TRIGGER TriggerName
ON TableName
AFTER INSERT, UPDATE
AS
BEGIN
---SQL statements here---
END;

触发器的工作原理

  • 事件激活:触发器绑定到特定表或视图,并侦听指定事件(INSERT、UPDATE、DELETE、CREATE 等),当这些事件之一发生时,触发器被激活。
  • 代码执行:激活后,触发器将执行一组预定义的 SQL 语句,这些可能包括涉及条件语句、循环和调用其他过程的复杂逻辑。
  • 执行范围:触发器可以在行级和语句级别上操作。
    • 行级触发器:行级触发器对受触发事件影响的每一行执行一次,确保触发器的操作在每个受影响行的粒度上应用。
    • 语句级触发器:语句级触发器对触发语句执行一次,而不管它影响的行数。

触发器中的操作

  • 删除触发器:可以使用 DROP 命令从数据库中删除触发器。
Drop TRIGGER TriggerName;
  • 显示触发器:可以使用 SHOW 命令显示数据库中的触发器。
SHOW TRIGGERS
In database_ name;
  • 插入触发器:SQL Server 中的插入触发器是一种特殊类型的存储过程,它自动执行以响应数据库中的 INSERT 事件。
CREATE TRIGGER [schema_name.]trigger_name
ON table_name
AFTER INSERT
AS
BEGIN
-- Insert your trigger logic here.
-- Specify the SQL statements to be executed upon trigger activation.
END

在这里,schema_name指定触发器的模式,如果没有提供,则使用默认模式(通常是dbo)。接下来,trigger_name是触发器的名称,table_name是触发器操作的表的名称,AFTER INSERT指定应该在向表中插入行之后调用触发器。SQL Server不像其他数据库系统那样支持BEFORE INSERT触发器。接下来,开始…END包含了定义触发器功能的SQL语句。这个块可以包含复杂的逻辑,包括调用其他过程、将数据插入到其他表中等等。

在这里插入图片描述

SQL Server 中存在多少种类型的触发器

触发器有四种类型:

  • 数据定义语言(DDL)触发器
  • 数据操作语言(DML)触发器
  • 公共语言运行时(CLR)触发器
  • 登录触发器

数据定义语言(DDL)触发器

DDL 触发器为响应 DDL 事件而触发,CREATE、ALTER、DROP、GRANT、DENY 和 REVOKE Transact-SQL 语句可以调用 DDL 触发器。调用的 DDL 触发器可以执行以下功能之一:

  • 当数据库架构发生修改时,它们会执行一组过程。
  • 它们在另一个表中记录使用这些语句执行的更改。

数据操作语言(DML)触发器

DML 触发器是在执行 DML 语句(如 INSERT、UPDATE 和 DELETE)时执行的过程。这些触发器通过自动创建名为 INSERTED 和 DELETED 的表来帮助进行审核,以记录修改数据库之前和之后的值。

DML 触发器根据其执行时间分为两种类型:

  • AFTER 触发器:它们在关联的 DML 操作成功完成后执行,这些用于数据修改后需要执行的操作。
  • 代替触发器:它们代替预期的DML操作执行,它们非常适合修改操作行为,例如在将数据写入数据库之前对其进行验证或转换。

公共语言运行时(CLR)触发器

CLR 触发器允许管理员在 SQL Server 实例中创建具有 SQL Server 环境外部引用对象的对象,这是一种特殊类型的触发器,可以直接插入到 .NET 语言代码中,并且在 SQL Server 2008 及更高版本中可用。

登录触发器

发生 SQL Server LOGON 事件时,将触发登录触发器,登录触发器可用于跟踪登录活动、控制登录尝试以及限制对关键 SQL Server 实例的登录。

在 SQL Server 中使用触发器的最佳实践

触发器是SQL Server中的一个强大功能,可以自动执行任务、执行业务规则和维护数据完整性。但是,由于它们对数据库性能和复杂性的潜在影响,应该谨慎使用它们。以下是有效利用触发器的一些关键指导方针:

  • 最小化触发器中的逻辑:使触发器中的逻辑尽可能简单高效。
  • 文档触发器:维护所有触发器的完整文档,包括其用途和效果,以帮助维护和调试。
  • 监控性能:定期检查触发器对性能的影响,并在必要时对其进行优化或重构。

使用 SQL 触发器的好处

  • SQL Server 中的触发器可自动执行繁琐的任务,例如记录更改和更新相关数据,从而节省宝贵的时间和精力。
  • 触发器执行规则和约束,并确保数据库保持准确和可靠,从而避免数据不一致的困扰。
  • 借助触发器,管理员可以将业务规则直接无缝集成到数据库层中,从而确保整个系统的行为一致。
  • 触发器可以强制访问控制和审计,保护数据库免受未经授权的访问和恶意活动。

是否有效地审核了 SQL Server 环境

尽管使用触发器审计 SQL Server 在某种程度上是有效的,但是这种方法有很大的局限性,只能为单个表创建触发器。因此,如果有 100 个需要监控的表,管理员则需要创建 100 个触发器,这是一个主要的操作瓶颈。创建审核触发器所需的时间和精力是相当可观的,这意味着审核不能仅仅依赖于触发器。手动审核数据库的管理员应仔细考虑选择 SQL Server。此外,SQL Server 触发器记录的信息不会提供对 SQL Server 环境中可能发生的事件或攻击的见解。

除了使用 SQL 触发器之外,还可以采用其他方法,例如SQL Trace和 SQL Server Profiler、数据库审计规范、服务器审计规范以及命令和控制审计。或者,可以使用日志管理解决方案(如EventLog Analyzer)来有效地审SQL Server日志。

EventLog Analyzer是一种有效的日志管理解决方案,可收集所有SQL Server日志,并为数据库中发生的所有 DDL、DML 和安全相关事件提供直观的报告。它可以为特权滥用、敏感数据泄露、帐户锁定、存储介质暴露、SQL 注入和 DoS 攻击等关键事件提供报告,管理员可以为这些事件设置警报,以便通过电子邮件和短信实时通知。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1866193.html

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

相关文章

七天速通javaSE:第二天 基础:标识符与数据类型

文章目录 前言一、注释与标识符1. 注释2. 标识符2.1 标识符2.2 关键字 二、数据类型1. 语言类型2. 数据类型2.1 基本数据类型2.2引用数据类型 三、类型转换1. 自动转换2. 强制转换(不建议) 四、代码规范 前言 今天将学习Java语法的基础,认识…

dataguard 主备切换方式switchover 和 failover 操作步骤

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG数据库运维(如安装迁移,性能优化、故障应急处理等) 公众号:老苏畅谈运维 欢迎关注本人公众号,更多精彩与您分享。datagu…

modelsim做后仿真的一点思路

这是以TD_5.6.3_Release_88061生成的网表文件(其他工具生成的网表文件类似),与modelsim联合进行门级仿真的样例,时序仿真与门级仿真的方法类似,只是增加了标准延时文件。 1、建立门级仿真工程 将门级网表和testbench添…

【Linux】线程Thread

🔥博客主页: 我要成为C领域大神🎥系列专栏:【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ ​ 线程概述 …

ROS学习(17):定位和地图绘制(1)

目录 0.前言 1.定位和建图 1.里程计(Odometry) 2.扫描匹配(Scan Matching) 3.结尾 0.前言 好久不见各位,前段时间忙着考试(6级和一些专业课)和摆烂断更了近30天,现在哥们回来更…

【移动应用开发期末复习】第五/六章

系列文章 第一章——Android平台概述 第一章例题 第二章——Android开发环境 第二章例题 第三章 第三章例题 第四章 系列文章界面布局设计线性布局表格布局帧布局相对布局约束布局控制视图界面的其他方法代码控制视图界面数据存储与共享首选项信息数据文件SQLite数据库Content…

【Linux】锁|死锁|生产者消费者模型

🔥博客主页: 我要成为C领域大神🎥系列专栏:【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ ​ 访问互斥 …

VOC格式转YOLO格式,xml文件转txt文件简单通用代码

目录 前言 思路介绍 代码 完整代码 拓展代码 前言 很多人在进行目标检测训练时习惯将得到的数据标注为XML文件的VOC格式,或者在网上获取的数据集被标注为XML文件,但是不同的标注工具进行的标注会产生不同的标注xml文件,这里我写了一种通用…

Ruby langchainrb gem and custom configuration for the model setup

题意:Ruby 的 langchainrb gem 以及针对模型设置的自定义配置 问题背景: I am working in a prototype using the gem langchainrb. I am using the module assistant module to implemente a basic RAG architecture. 我正在使用 langchainrb 这个 ge…

初识Java(二)

初识Java的main方法 1.1 main方法示例 public class world {public static void main(String[] args) {System.out.println("hello,world!");}}通过上述代码,我们可以看到一个完整的Java程序的结构,Java程序的结构由如下三个部分组成&#x…

标签接口开发(富含完整CRUD开发流程)

文章目录 1.easyCode生成CRUD1.生成代码2.查看代码3.调整代码1.SubjectLabelDao.xml发现生成的select语句不带逗号!!!1.解决方法:2.entity.java.vm3.dao.java.vm4.Mapper.xml.vm 2.重新生成代码3.SubjectLabelDao.java 删除Pageab…

11-Django项目--Ajax请求二

目录 模版: demo_list.html perform_list.html 数据库操作: 路由: 视图函数: Ajax_data.py perform.py 模版: demo_list.html {% extends "index/index.html" %} {% load static %} # 未实现修改,删除操作{% block content %}<div class"container…

nacos在k8s上的集群安装实践

目录 概述实践nfs安装使用 k8s持久化nacos安装创建角色部署数据库执行数据库初始化语句部署nacos ingress效果展示 结束 概述 本文主要对 nacos 在k8s上的集群安装 进行说明与实践。主要版本信息&#xff0c;k8s: 1.27.x&#xff0c;nacos: 2.0.3。运行环境为 centos 7.x。 实…

江协科技51单片机学习- p19 串口通信

前言&#xff1a; 本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记&#xff0c;在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。 引用&#xff1a; 51单片机入门教程-2…

力扣:59. 螺旋矩阵 II(Java,模拟)

目录 题目描述示例 1&#xff1a;代码实现 题目描述 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5…

node mySql 实现数据的导入导出,以及导入批量插入的sql语句

node 实现导出, 在导出excel中包含图片&#xff08;附件&#xff09; node 实现导出, 在导出excel中包含图片&#xff08;附件&#xff09;-CSDN博客https://blog.csdn.net/snows_l/article/details/139999392?spm1001.2014.3001.5502 一、效果 如图&#xff1a; 二、导入 …

此消彼长之间,国货品牌如何“进化”?

2024年&#xff0c;国内运动鞋服行业各品牌的股价集体回暖。年初至今&#xff08;1月2日至6月26日&#xff09;&#xff0c;港股的四大运动品牌中&#xff0c;361度涨幅达30.55%&#xff0c;特步上涨19.1%&#xff0c;安踏上涨7.75%&#xff0c;而李宁与美股市场的耐克组成了“…

【ARM】内存属性Memory Attributes (MemAttr)

目录 1. EWA 2. Device 3. Cacheable 4. Allocate 5. 内存属性的传播 6. 事务属性组合 7. Memory Type 内存属性Memory Attributes (MemAttr) 包含Early Write Acknowledgment (EWA), Device, Cacheable, 以及Allocate。 1. EWA EWA&#xff0c;Early Write Acknowledg…

Java进阶-Lambda

Java进阶-Lambda 前言Lambda表达式什么是Lambda表达式初识Lambda表达式Lambda表达式的简单使用Lambda表达式格式分析与传统接口方法实现的比较 理解Lambda表达式函数式编程非纯函数实例纯函数示例函数式编程在Lambda表达式中的体现 闭包闭包与Lambda表达式的示例 类型推导-匿名…

裸机与操做系统区别(RTOS)

声明&#xff1a;该系列笔记是参考韦东山老师的视频&#xff0c;链接放在最后&#xff01;&#xff01;&#xff01; rtos&#xff1a;这种系统只实现了内核功能&#xff0c;比较简单&#xff0c;在嵌入式开发中&#xff0c;某些情况下我们只需要多任务&#xff0c;而不需要文件…