SQL Server 触发器实例详解

SQL Server 触发器实例详解

什么是SQL Server触发器?

SQL Server 触发器是一段特殊的代码,可以自动地在特定情况下执行。当执行到 SQL Server 数据库上的特定动作时,触发器将会被激活,并执行预定义好的代码。触发器通常被用来在数据库发生变化时执行额外的自定义代码。

SQL Server 触发器的分类

SQL Server 触发器总共分为两种类型:

  • 行级触发器:是在数据的每一行被插入、更新或删除时,都会自动运行一次的触发器。
  • 语句级触发器:是在 SQL 数据库上的某个特定语句运行时立即自动运行的触发器。

SQL Server 触发器的语法

CREATE TRIGGER trigger_name 
{ AFTER | INSTEAD OF } {update,delete,insert} 
ON {table_name} 
[REFERENCING [{OLD | NEW} AS alias_name}]
[FOR EACH {ROW | STATEMENT}]
[WHEN (logical_expression)]
{sql_statement}

具体来说,该语法有以下几个重要的部分。

  • CREATE TRIGGER:触发器的创建命令。
  • trigger_name:触发器的名字。
  • { AFTER | INSTEAD OF }:指明触发器是在执行操作之后还是代替执行操作之前运行。
  • {update,delete,insert}:指明在何种操作时运行触发器。
  • ON {table_name}:指明在哪张表上运行触发器。
  • [REFERENCING [{OLD | NEW} AS alias_name}]:指明“OLD”或“NEW”关键字。这可以帮助我们引用旧值或新值。
  • [FOR EACH {ROW | STATEMENT}]:指明触发器是对每一行记录执行还是对整个语句执行。
  • [WHEN (logical_expression)]:定义逻辑测试。如果测试失败,则该触发器不会被触发。
  • {sql_statement}:需要在触发器中执行的 SQL 语句。

SQL Server 触发器创建示例

示例1:创建一个简单的SQL Server触发器

在 AdventureWorks 数据库上创建一个员工信息表,并在该表上创建一个触发器,以确保每个新员工的雇佣日期按年月日顺序执行。

USE AdventureWorks
GO

CREATE TABLE Employee
(
 EmployeeID INT PRIMARY KEY IDENTITY(1,1),
 LastName VARCHAR (50) NOT NULL,
 FirstName VARCHAR (50),
 HireDate DATE
)
GO

CREATE TRIGGER tr_insert_employee
ON Employee
FOR INSERT
AS
BEGIN
 IF EXISTS (
 SELECT 1
 FROM inserted i
 WHERE i.HireDate < CAST(GETDATE() AS DATE)
 )
 BEGIN
 PRINT 'Cannot insert employee with hire date before today!'
 ROLLBACK TRANSACTION
 RETURN
 END

 DECLARE @insertedID INT
 SELECT @insertedID = [EmployeeID] FROM INSERTED

 UPDATE Employee SET [HireDate] = CAST(CONVERT(VARCHAR(10), [HireDate], 111) AS DATE) WHERE EmployeeID = @insertedID
END

示例2:创建一个基于多个表的SQL Server触发器

在 AdventureWorks 数据库上创建两个员工信息表:Employee和EmployeeBackup,并在这两个表上创建触发器,以确保当 Employee 中的数据更新时,EmployeeBackup 中的对应数据也会得到更新。

USE AdventureWorks
GO

CREATE TABLE Employee
(
 EmployeeID INT PRIMARY KEY IDENTITY(1,1),
 LastName VARCHAR (50) NOT NULL,
 FirstName VARCHAR (50),
 HireDate DATE
)
GO

CREATE TABLE EmployeeBackup
(
 EmployeeID INT PRIMARY KEY,
 LastName VARCHAR (50) NOT NULL,
 FirstName VARCHAR (50),
 HireDate DATE
)
GO

CREATE TRIGGER tr_update_employee
ON Employee
AFTER UPDATE
AS
BEGIN
 UPDATE EmployeeBackup
 SET LastName = i.LastName,
     FirstName = i.FirstName,
     HireDate = i.HireDate
 FROM EmployeeBackup e
 INNER JOIN inserted i ON i.EmployeeID = e.EmployeeID
END

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SQL Server 触发器实例详解 - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • SQL 中 DROP 和 TRUNCATE 的区别

    下面是SQL中DROP和TRUNCATE的区别的完整攻略: DROP和TRUNCATE的定义 DROP和TRUNCATE都是SQL中常用的删除表数据的操作语句。但是二者的作用和使用方法略有不同。 DROP是一种完全删除表的结构,包括所有关联的约束和索引,数据会被永久删除,不能恢复。 TRUNCATE删除表的数据,但是不删除表的结构、约束和索引等其他属性,数据…

    database 2023年3月27日
    00
  • 如何使用Python实现数据库中数据的批量修改?

    以下是使用Python实现数据库中数据的批量修改的完整攻略。 数据库中数据的批量修改简介 在数据库中,批量修改是一次性修改多条记录。在Python中,可以使用pymysql连接MySQL数据库,并使用UPDATE语句实现批量修改。 步骤1:连接数据库 在Python中,可以使用pymysql连接MySQL数据库。以下是连接到MySQL的基本语法: impor…

    python 2023年5月12日
    00
  • SQL 从给定日期值里提取年月日时分秒

    提取SQL日期值里的年月日时分秒可以使用函数来完成,一般情况下可以使用以下函数来提取SQL日期值: YEAR(date):返回日期中的年份。 MONTH(date):返回日期中的月份。 DAY(date):返回日期中的天数。 HOUR(time):返回时间中的小时数。 MINUTE(time):返回时间中的分钟数。 SECOND(time):返回时间中的秒数…

    database 2023年3月27日
    00
  • PHP 5.6.11中CURL模块问题的解决方法

    下面是“PHP 5.6.11中CURL模块问题的解决方法”的完整攻略,具体内容如下: 问题描述 在PHP 5.6.11的环境中,使用CURL模块时会出现一些问题,例如无法正常发送HTTP请求、出现SSL证书验证失败等问题,这些问题都会影响到应用的正常运行。 解决方法 解决这个问题的方法是升级CURL模块。具体的步骤如下: 步骤一:备份原有的CURL模块 在进…

    database 2023年5月22日
    00
  • MySQL 数据库铁律(小结)

    MySQL 数据库铁律(小结)是一篇总结了 MySQL 数据库的最佳实践的文章。文章提供了一些有用的提示,可以帮助用户在设计和维护 MySQL 数据库时更加高效和规范。 下面是两个示例说明: 将数据库对象放入适当的模式中 在 MySQL 中,模式是一个数据库对象容器,可以帮助用户更好地组织、管理和保护数据库对象。如果没有使用模式,可能会导致数据库对象变得混乱…

    database 2023年5月22日
    00
  • PHP获取MySQL执行sql语句的查询时间方法

    获取MySQL执行SQL语句的查询时间,一般可以通过PHP函数来实现。本攻略将提供两种方法,以供参考。 方法一:使用microtime()函数 $start_time = microtime(true); // 记录开始执行时间 // 执行SQL语句 $sql = "SELECT * FROM TABLE_NAME"; $result =…

    database 2023年5月22日
    00
  • MySQL延时复制库方法详解

    MySQL延时复制库方法详解 延时复制是MySQL主从复制的一种特殊的实现方式,它可以实现将从库的复制延迟一定的时间,从而达到数据备份的目的。本文将详细讲解MySQL延时复制库的实现方法及注意事项,帮助读者更好地掌握这项技术。 一、什么是MySQL延时复制库 MySQL延时复制库指的是在主从复制中,将从库的复制延迟一定时间,使得从库的数据更新与主库有一定的时…

    database 2023年5月22日
    00
  • Mysql下自动删除指定时间以前的记录的操作方法

    Mysql下自动删除指定时间以前的记录,可以通过以下步骤实现: 1. 创建一个定时任务 我们可以使用linux中的crontab命令来创建定时任务,用来定期执行删除操作。具体命令格式如下: crontab -e 这个命令会打开一个文本编辑器,我们需要在其中添加定时任务。例如,如果我们需要每天凌晨3点执行删除操作,那么可以添加如下一行: 0 3 * * * /…

    database 2023年5月21日
    00
合作推广
合作推广
分享本页
返回顶部