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 用于视图或条件拦截。防止非法数据变更、记录操作人/时间、同步多表数据。⚠️ 注意触发器会增加开销、降低可读性与维护性‌优先用约束、外键、存储过程‌仅在必要时用触发器。‌定义语法‌sqlCREATE TRIGGER trigger_nameON table_or_view[WITH ENCRYPTION]{AFTER | INSTEAD OF} [INSERT, UPDATE, DELETE] -- DML触发器ASBEGIN-- T-SQL 逻辑可含 IF UPDATE(column)、IF EXISTS(SELECT * FROM inserted/deleted)-- 使用 inserted/deleted 表访问变更数据END;‌AFTER‌操作成功后执行默认若约束失败则不触发。‌INSTEAD OF‌‌替代原操作‌常用于视图或自定义拦截逻辑。仅 DML 触发器支持 INSTEAD OFDDL/登录触发器作用于服务器/数据库级别语法不同如 ON ALL SERVER。一个表上可对同一事件如 UPDATE定义多个触发器但执行顺序默认随机可用 sp_settriggerorder 设首/尾。‌使用示例‌‌AFTER UPDATE 自动更新时间戳‌sqlCREATE TRIGGER tr_UpdateModifiedTimeON EmployeesAFTER UPDATEASBEGINIF UPDATE(Email) -- 仅当 Email 被改时执行UPDATE EmployeesSET ModifiedTime GETDATE()FROM Employees e JOIN inserted i ON e.ID i.ID;END;‌INSTEAD OF 阻止删除特定记录‌sqlCREATE TRIGGER tr_PreventDeleteAdminON UsersINSTEAD OF DELETEASBEGINIF EXISTS (SELECT * FROM deleted WHERE Role Admin)RAISERROR(禁止删除管理员, 16, 1);ELSEDELETE 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 DeptId1 update Depart set DepartName 计算机系xxx where DeptId1CREATE TRIGGER DeleteCollegeTrigger ON College AFTER DELETE AS BEGIN -- deleted你从College删除的哪个结果集 delete from Depart where CollegeId in (SELECT CollegeId FROM deleted) END go2.临时表了解--临时表临时创建表但和视图不一样。 --在一个会话中有效。 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 #mytable3.作业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