SQL Server 触发器的使用与创建

数据库管理中,经常需要跟踪记录的创建时间和修改时间。SQL Server提供了触发器这一功能,允许在对特定表进行更新、删除或插入操作时执行SQL命令。本文将介绍如何在SQL Server中创建和使用触发器,以自动更新记录的创建时间和修改时间。

SQL Server中,触发器是一种特殊的存储过程,它在对数据库表执行INSERT、UPDATE或DELETE操作时自动执行。触发器可以用于实现复杂的业务逻辑、数据完整性约束、自动更新时间戳等。更多关于触发器的详细信息,可以参考官方文档:。

创建数据表

首先,需要创建一个包含创建时间和修改时间字段的数据表。以下是创建这样一个表的SQL语句:

CREATE TABLE [my_table] ( [id] INT IDENTITY(1,1) NOT NULL, [my_data] NVARCHAR(50) NULL, [created_on] DATETIME NOT NULL, [modified_on] DATETIME NOT NULL ) ON [PRIMARY]

接着,为创建时间和修改时间字段添加默认值,这样在插入新记录时,这两个字段会自动设置为当前日期和时间:

ALTER TABLE [my_table] ADD CONSTRAINT [DF_my_table_created_on] DEFAULT (GETDATE()) FOR [created_on] ALTER TABLE [my_table] ADD CONSTRAINT [DF_my_table_modified_on] DEFAULT (GETDATE()) FOR [modified_on]

创建触发器

创建触发器的目的是确保每当记录被更新时,修改时间字段(modified_on)都会被设置为当前日期和时间。以下是创建这样一个触发器的SQL语句:

CREATE TRIGGER trg_update_my_table ON my_table FOR UPDATE AS BEGIN UPDATE my_table SET modified_on = GETDATE() FROM my_table INNER JOIN deleted d ON my_table.id = d.id END GO

SQL Server为每个事务维护两个元表:inserted和deleted。inserted记录新插入的行,而deleted记录被删除的行。在触发器中,使用deleted表来获取更新前的记录。需要注意的是,一个命令可能会更新多行或零行,使用JOIN操作可以处理这些情况。

允许覆盖修改时间

默认情况下,触发器会覆盖修改时间字段的任何更改。如果希望阻止这种覆盖,可以修改触发器的代码,仅在修改时间字段未被修改时更新它:

CREATE TRIGGER trg_update_my_table ON my_table FOR UPDATE AS BEGIN IF NOT UPDATE(modified_on) BEGIN UPDATE my_table SET modified_on = GETDATE() FROM my_table INNER JOIN deleted d ON my_table.id = d.id END END GO

禁止覆盖创建时间

同样,如果不希望创建时间字段被意外覆盖,可以在触发器中显式地设置创建时间字段为更新前的值:

CREATE TRIGGER trg_update_my_table ON my_table FOR UPDATE AS BEGIN UPDATE my_table SET modified_on = GETDATE(), created_on = d.created_on FROM my_table INNER JOIN deleted d ON my_table.id = d.id END GO
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485