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=1CREATE 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