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

SQL Server 触发器

在 SQL Server 中,触发器是一种特殊类型的存储过程,它会在特定事件发生时自动执行。触发器主要分为以下几种类型:

  1. DML 触发器(Data Manipulation Language Triggers)
  2. DDL 触发器(Data Definition Language Triggers)
  3. 登录触发器(Logon Triggers)

1. DML 触发器

DML 触发器用于响应数据操作语言(INSERT、UPDATE、DELETE)语句。这些触发器可以定义在表或视图上。

示例:创建一个 AFTER INSERT 触发器

sql

-- 创建一个示例表
CREATE TABLE Employees (
    EmployeeID INT IDENTITY(1,1) PRIMARY KEY,
    Name NVARCHAR(100),
    Position NVARCHAR(100)
);
GO

-- 创建一个审计表
CREATE TABLE EmployeeAudit (
    AuditID INT IDENTITY(1,1) PRIMARY KEY,
    EmployeeID INT,
    Name NVARCHAR(100),
    Position NVARCHAR(100),
    ActionTime DATETIME DEFAULT GETDATE()
);
GO

-- 创建一个 AFTER INSERT 触发器
CREATE TRIGGER trgAfterInsert
ON Employees
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO EmployeeAudit (EmployeeID, Name, Position)
    SELECT EmployeeID, Name, Position
    FROM inserted;
END;
GO

-- 测试触发器
INSERT INTO Employees (Name, Position) VALUES ('John Doe', 'Developer');
SELECT * FROM EmployeeAudit;

2. DDL 触发器

DDL 触发器用于响应数据定义语言(CREATE、ALTER、DROP)语句。它们可以定义在数据库级别或服务器级别,用于捕获和处理数据库对象的更改。

示例:创建一个数据库级别的 DDL 触发器

sql

-- 创建一个审计表
CREATE TABLE DDL_Audit (
    AuditID INT IDENTITY(1,1) PRIMARY KEY,
    EventType NVARCHAR(100),
    ObjectName NVARCHAR(256),
    EventTime DATETIME DEFAULT GETDATE(),
    LoginName NVARCHAR(256)
);
GO

-- 创建一个数据库级别的 DDL 触发器
CREATE TRIGGER trgDatabaseDDL
ON DATABASE
FOR CREATE_TABLE, ALTER_TABLE, DROP_TABLE
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @EventData XML;
    SET @EventData = EVENTDATA();

    INSERT INTO DDL_Audit (EventType, ObjectName, EventTime, LoginName)
    VALUES (
        @EventData.value('(/EVENT_INSTANCE/EventType)[1]', 'NVARCHAR(100)'),
        @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]', 'NVARCHAR(256)'),
        GETDATE(),
        @EventData.value('(/EVENT_INSTANCE/LoginName)[1]', 'NVARCHAR(256)')
    );
END;
GO

-- 测试触发器
CREATE TABLE TestTable (ID INT);
ALTER TABLE TestTable ADD Name NVARCHAR(100);
DROP TABLE TestTable;

SELECT * FROM DDL_Audit;

3. 登录触发器

登录触发器是在用户尝试连接到 SQL Server 实例时触发的。它们通常用于控制登录行为或记录登录活动。

示例:创建一个登录触发器

sql

-- 创建一个审计表
CREATE TABLE LogonAudit (
    AuditID INT IDENTITY(1,1) PRIMARY KEY,
    LoginName NVARCHAR(256),
    LoginTime DATETIME DEFAULT GETDATE(),
    ClientHost NVARCHAR(256)
);
GO

-- 创建一个登录触发器
CREATE TRIGGER trgLogon
ON ALL SERVER
FOR LOGON
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO master.dbo.LogonAudit (LoginName, LoginTime, ClientHost)
    VALUES (ORIGINAL_LOGIN(), GETDATE(), HOST_NAME());
END;
GO

-- 测试触发器
-- 注销并重新登录,然后检查审计表
SELECT * FROM master.dbo.LogonAudit;

总结

  • DML 触发器:用于响应 INSERT、UPDATE 和 DELETE 操作,可以定义在表或视图上。
  • DDL 触发器:用于响应 CREATE、ALTER 和 DROP 操作,可以定义在数据库级别或服务器级别。
  • 登录触发器:用于响应用户登录事件,可以定义在服务器级别。

通过使用这些不同类型的触发器,你可以在 SQL Server 中实现复杂的业务逻辑、审计和安全控制。

相关文章:

  • Python中的列表:全面解析与应用指南
  • uniapp配置代理解决跨域问题
  • PyTorch入门指南:环境配置与张量初探
  • 您对下列文件的本地修改将被合并操作覆盖XXXXX请 在 合 并前 提 交 或贮 藏 您 的 修 改
  • Mac:Ant 下载+安装+环境配置(详细讲解)
  • 2025年渗透测试面试题总结-某四字大厂实习面试复盘 二面(题目+回答)
  • 多种语言请求API接口方法
  • Python、MATLAB和PPT完成数学建模竞赛中的地图绘制
  • 【AI大模型】提示词(Prompt)工程完全指南:从理论到产业级实践
  • Linux上的`i2c-tools`工具集的编译构建和安装
  • 适合安卓开发工程师在 Android Studio 上使用的 AI 产品
  • A SURVEY ON POST-TRAINING OF LARGE LANGUAGE MODELS——大型语言模型的训练后优化综述——第一部分
  • 1.FastAPI简介与安装
  • Prometheus 和 Grafana科普介绍
  • 有emacs org babel, 还要什么数据分析软件
  • Git版本管理 | 基础指令汇总
  • 极空间NAS部署gitea教程
  • 初始OpenCV
  • ## DeepSeek写射击手机小游戏
  • Redis GeoHash 详解
  • 时代邻里:拟收购成都合达联行科技剩余20%股权
  • 龚曙光:散文家永远只有一个视角,就是“我与时代”
  • 印媒称印巴在克什米尔控制线沿线发生小规模交火,巴方暂未回应
  • 今年地质灾害防治形势严峻,哪些风险区被自然资源部点名?
  • 马上评︱大厂取消“大小周”,会让加班隐形化吗
  • 上海市闵行区原二级巡视员琚汉铮接受纪律审查和监察调查