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

数据库语句 触发器 作业

1.触发器(了解)

SQL Server 触发器是一种特殊的自动执行存储过程,绑定在表或视图上,在指定数据操作(INSERT/UPDATE/DELETE)或数据库/登录事件发生时自动触发,‌不能被显式调用‌。‌‌‌‌

‌概念‌

触发器(Trigger)是与‌表或视图关联的 DML/DDL/登录事件驱动的特殊存储过程‌。

主要分为三类:

‌DML 触发器‌:响应 INSERT、UPDATE、DELETE 操作(可为 AFTER 或 INSTEAD OF)。

‌DDL 触发器‌:响应数据库或服务器级别的结构变更(如 CREATE、ALTER、DROP)。

‌登录触发器‌:响应用户登录事件(LOGIN)。

执行时系统自动生成两个逻辑表:‌inserted‌(新数据)和 ‌deleted‌(旧数据),用于比较变更前后状态。

触发器运行在‌事务上下文中‌,内部出错会回滚整个触发语句事务。

SqlServer包括三种常规类型的触发器:DML触发器、DDL触发器和登录触发器。

1.DML(数据操作语言,Data Manipulation Language)触发器

DML触发器是一些附加在特定表或视图上的操作代码,当数据库服务器中发生数据操作语言事件时执行这些操作。SqlServer中的DML触发器有三种:

insert触发器:向表中插入数据时被触发;

delete触发器:从表中删除数据时被触发;

update触发器:修改表中数据时被触发。

当遇到下列情形时,应考虑使用DML触发器:

通过数据库中的相关表实现级联更改

防止恶意或者错误的insert、update和delete操作,并强制执行check约束定义的限制更为复杂的其他限制。

评估数据修改前后表的状态,并根据该差异才去措施。

2.DDL(数据定义语言,Data Definition Language)触发器

DDL触发器是当服务器或者数据库中发生数据定义语言(主要是以create,drop,alter开头的语句)事件时被激活使用,使用DDL触发器可以防止对数据架构进行的某些更改或记录数据中的更改或事件操作。

3.登录触发器

登录触发器将为响应 LOGIN 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。因此,来自触发器内部且通常将到达用户的所有消息(例如错误消息和来自 PRINT 语句的消息)会传送到 SQL Server 错误日志。如果身份验证失败,将不激发登录触发器。

‌‌

‌作用‌

强制‌复杂业务规则‌(如跨表校验、信用控制),超越 CHECK 约束能力。

维护‌引用完整性‌(尤其跨数据库场景,虽外键更优但触发器更灵活)。

实现‌级联操作、审计日志、自动更新字段‌(如修改时间)。

‌拦截或替代‌ DML 操作(INSTEAD OF 用于视图或条件拦截)。

防止非法数据变更、记录操作人/时间、同步多表数据。

⚠️ 注意:触发器会增加开销、降低可读性与维护性;‌优先用约束、外键、存储过程‌,仅在必要时用触发器。

‌定义(语法)‌

sql

CREATE TRIGGER trigger_name

ON table_or_view

[WITH ENCRYPTION]

{AFTER | INSTEAD OF} [INSERT, UPDATE, DELETE] -- DML触发器

AS

BEGIN

-- T-SQL 逻辑(可含 IF UPDATE(column)、IF EXISTS(SELECT * FROM inserted/deleted))

-- 使用 inserted/deleted 表访问变更数据

END;

‌AFTER‌:操作成功后执行(默认);若约束失败则不触发。

‌INSTEAD OF‌:‌替代原操作‌,常用于视图或自定义拦截逻辑。

仅 DML 触发器支持 INSTEAD OF;DDL/登录触发器作用于服务器/数据库级别,语法不同(如 ON ALL SERVER)。

一个表上可对同一事件(如 UPDATE)定义多个触发器,但执行顺序默认随机(可用 sp_settriggerorder 设首/尾)。

‌使用示例‌

‌AFTER UPDATE 自动更新时间戳‌:

sql

CREATE TRIGGER tr_UpdateModifiedTime

ON Employees

AFTER UPDATE

AS

BEGIN

IF UPDATE(Email) -- 仅当 Email 被改时执行

UPDATE Employees

SET ModifiedTime = GETDATE()

FROM Employees e JOIN inserted i ON e.ID = i.ID;

END;

‌INSTEAD OF 阻止删除特定记录‌:

sql

CREATE TRIGGER tr_PreventDeleteAdmin

ON Users

INSTEAD OF DELETE

AS

BEGIN

IF EXISTS (SELECT * FROM deleted WHERE Role = 'Admin')

RAISERROR('禁止删除管理员', 16, 1);

ELSE

DELETE FROM Users WHERE ID IN (SELECT ID FROM deleted);

END;

‌查看/管理触发器‌:

sql

-- 列出所有触发器

SELECT name FROM sys.triggers;

-- 查看触发器内容

EXEC sp_helptext 'tr_UpdateModifiedTime';

-- 禁用/启用触发器

ALTER TABLE Employees DISABLE TRIGGER tr_UpdateModifiedTime;

ALTER TABLE Employees ENABLE TRIGGER tr_UpdateModifiedTime;

-- 删除触发器

DROP TRIGGER tr_UpdateModifiedTime;

‌关键注意事项‌

‌TRUNCATE TABLE 不触发 DML 触发器‌(无日志记录)。

触发器内‌不可用 RETURN、PRINT(仅调试)‌,避免返回结果集干扰应用。

默认嵌套深度 ‌32 层‌,递归需显式启用(sp_dboption 'db', 'recursive triggers', true)。

避免在触发器中写复杂逻辑或调用外部服务,易引发锁、死锁、性能瓶颈。

‌始终包含错误处理‌(如 TRY...CATCH + ROLLBACK),确保事务一致性。

触发器是“双刃剑”——强大但隐晦,‌仅用于无法通过约束、默认值、应用层逻辑实现的核心数据规则‌。

--SQL Server 触发器是一种特殊的自动执行存储过程。 --绑定在表或视图上。 --在院系Depart表中定义一个触发器MyTrigger CREATE TRIGGER MyTrigger ON Depart AFTER UPDATE -- 更改Depart表中数据的时候触发 AS BEGIN IF UPDATE(DepartName) -- 如果你更改院系的名称时 begin insert into College(CollegeName,CreateUserId) values('XXXXX',1) end END go update Depart set CollegeId = 2 where DeptId=1 update Depart set DepartName = '计算机系xxx' where DeptId=1
CREATE TRIGGER DeleteCollegeTrigger ON College AFTER DELETE AS BEGIN -- deleted你从College删除的哪个结果集 delete from Depart where CollegeId in (SELECT CollegeId FROM deleted) END go

2.临时表(了解)

--临时表:临时创建表,但和视图不一样。 --在一个会话中有效。 create table #mytable( Id int primary key not null, MyName varchar(50) not null ) insert into #mytable(Id,MyName) values(1,'dsh') insert into #mytable(Id,MyName) values(2,'dsh') select * from #mytable

3.作业

SQL Server 作业(Job)是由 SQL Server Agent 管理的、按计划自动执行的一组预定义操作步骤,用于自动化数据库维护与管理任务。‌‌

‌概念‌:作业是 SQL Server Agent 中可调度、可监控的多步骤任务集合,每个步骤可执行 T-SQL 脚本、存储过程、SSIS 包、命令行程序等;依赖 ‌SQL Server Agent 服务运行‌ 才能自动触发

‌定义‌:在 msdb 数据库中通过系统表(如 sysjobs、sysjobsteps)定义,需指定名称、类别、所有者、一个或多个步骤、调度计划(时间/事件触发)及通知方式。

‌作用‌:自动化日常运维(如备份、日志循环、索引重建、数据清理、ETL、报表生成),减少人工干预,保障一致性、及时性与系统稳定性,支持告警与历史审计。

‌使用方式‌:通过 ‌SSMS 图形界面‌(SQL Server Agent → 作业 → 新建作业)或 ‌T-SQL 存储过程‌(如 sp_add_job、sp_add_jobstep、sp_add_schedule、sp_attach_schedule)创建;启用 SQL Server Agent 服务后,按调度自动执行,也可手动 EXEC msdb.dbo.sp_start_job @job_name = '...'。

‌‌

需注意:SQL Server Agent 在 SQL Server Express 版本中不可用;作业仅在 Agent 服务处于“正在运行”状态时生效。核心管理涉及作业的‌创建→配置步骤→设置调度→启用→监控历史‌(通过 sysjobhistory)。

技术参考:https://download.csdn.net/blog/column/12681594/139170021

‌‌

-- 创建存储过程以备份数据库 CREATE PROCEDURE BackupDataBase @BackupPath NVARCHAR(260) AS BEGIN SET NOCOUNT ON; DECLARE @BackupFileName NVARCHAR(260); SET @BackupFileName = @BackupPath + '\DongShuHua_' + CONVERT(VARCHAR, GETDATE(), 112) + '.bak'; -- 执行备份操作 BACKUP DATABASE DongShuHua TO DISK = @BackupFileName WITH FORMAT; -- 格式化备份介质以供将来使用 END; GO
http://www.jsqmd.com/news/957540/

相关文章:

  • 如何用PyVista实现专业级3D可视化:从数据到洞察的完整指南
  • 为什么我建议2026年程序员转行首先要选网络安全?
  • 遇上 Bug 别慌:用 GPT-5.5 + Claude 3.5 双重验证解决复杂代码报错
  • 微信与手机厂商合作推A2A助手,超级App与系统级AI助手争夺AI时代入口
  • 如何在Linux系统上安装Realtek 8852AE Wi-Fi 6驱动:完整指南
  • 如何利用Chinese-Medical-DIALOGUE-Data构建智能医疗对话系统:5大关键技术解析
  • 如何5分钟完成配置:3DS平台终极宝可梦存档管理器完整指南
  • 从百度程序员被抓事件,聊聊企业内部数据防篡改的3个技术方案(附脚本审计思路)
  • 基于小程序的酒店管理系统毕业设计
  • 3大3D渲染范式革新:F3D如何重塑跨平台可视化技术栈
  • 2026年 重庆水处理药剂厂家推荐榜单:聚合氯化铝/聚丙烯酰胺/次氯酸钠/硫酸亚铁/氯酸钠/漂白粉品牌精选与深度解析 - 品牌企业推荐师(官方)
  • 国际EMBA怎么选?5大主流国际EMBA项目全方位对比分析
  • 中医舌诊用YOLO11舌苔识别工具:含BiFPN+SDI增强模块、标注数据集与可视化界面
  • GHelper终极指南:10MB替代Armoury Crate的华硕笔记本控制神器
  • XHS-Downloader:小红书作品批量下载工具全攻略
  • 2026年青海西宁市TOP5折扣力度大的家电门店,你了解几家?
  • 动态规划-0-1背包问题
  • 微信好友检测秘籍:3分钟发现谁悄悄删了你,彻底清理无效社交
  • 基于小程序的青年公寓服务平台毕设
  • 战略管理国际EMBA怎么选?2026五大顶尖项目深度解析
  • 2026年祛痘精华液哪家好:权威TOP5专业深度测评 - 13425704091
  • 提升到底有多大?GPT-5.5 编程实测:从零构建 Web 应用的效率极限
  • 终极解决方案:CAD Sketcher 0.27.6安装失败问题深度剖析与修复指南
  • 跨境支付AML漏检率骤降81%的秘密(某国有大行Gemini私有化部署内部技术备忘录节选)
  • 2026年干皮适用的精华液哪家好:独家榜单官方深度测评 - 13425704091
  • 2026年青春期精华液哪家好:专业TOP5深度解析指南 - 17322238651
  • Matlab版钢筋腐蚀率智能预测工具:拖拽导入数据、调参训练、结果可视化一键完成
  • 搬了两次,才算真正搬完——一次装修过渡期搬迁的完整记录 - 知行集录
  • 新手友好:通过快马平台生成嵌入式按键控制LED入门项目代码
  • 正则表达式用法