触发器(Trigger)是一种特殊类型的存储过程,它与表相关联。触发器包含事件和该事件发生时要执行的 SQL语句,当与表相关的任何事件发生时(如插入、更新或删除行),该事件上的触发器将被激活,从而触发器中指定的 SQL语句将被执行。触发器通常用来维护数据完整性以及实现复杂的业务逻辑。
SQL Server 触发器的分类:
- DML 触发器:INSERT、UPDATE 或 DELETE 语句更改表中行时触发
- DDL 触发器:ALTER、CREATE 或 DROP 语句更改数据库架构时触发
- 应用程序触发器:由应用程序触发的 SQL 代码块
下面介绍触发器的使用方法和案例说明。
1. 创建触发器
创建触发器的语法如下:
```
CREATE TRIGGER trigger_name
ON table_name
[FOR/ AFTER/ INSTEAD OF] {INSERT/DELETE/UPDATE}
AS
BEGIN
--- 触发器语句
END;
```
示例代码:
```
CREATE TRIGGER [dbo].[person_insert]
ON [dbo].[person]
AFTER INSERT
AS
-- 在人员信息表中添加一行时自动向日志表中添加一条记录
INSERT INTO dbo.person_log (person_id, log) SELECT id, 'New person added.' FROM inserted;
GO
```
2. 修改触发器
修改触发器的语法如下:
```
ALTER TRIGGER trigger_name
ON table_name
[FOR/ AFTER/ INSTEAD OF] {INSERT/DELETE/UPDATE}
AS
BEGIN
--- 触发器语句
END;
```
示例代码:
```
ALTER TRIGGER [dbo].[person_insert]
ON [dbo].[person]
AFTER INSERT
AS
-- 修改添加日志记录的内容
INSERT INTO dbo.person_log (person_id, log) SELECT id, 'A new person with name ' + name + ' and age ' + CONVERT(VARCHAR(50), age) + ' has been added.' FROM inserted;
GO
```
3. 删除触发器
删除触发器的语法如下:
```
DROP TRIGGER trigger_name
ON table_name;
```
示例代码:
```
DROP TRIGGER [dbo].[person_insert];
GO
```
4. 触发器示例1:数据完整性
对于某些情况下需要维护数据完整性的情况,触发器是一种很好的选择。例如,在人员信息表中创建一个触发器来确保一个名为 “M” 的男性不会有年龄超过 30 岁的记录:
```
CREATE TRIGGER [dbo].[person_age_check]
ON [dbo].[person]
AFTER INSERT, UPDATE
AS
IF EXISTS(SELECT 1 FROM inserted WHERE name = 'M' AND gender = 'Male' AND age > 30)
BEGIN
RAISERROR ('The maximum age for a male person named "M" is 30.', 16, 1);
ROLLBACK TRANSACTION;
END;
GO
```
5. 触发器示例2:审计日志
许多应用程序需要跟踪每次数据库中的更新、插入或删除操作。为了实现这样的功能,可以创建一个审计日志表,每次对数据库表执行任何操作时,都将插入一行到此审计表中。下面是一个示例触发器,将每次在人员信息表中插入或删除行时记录到人员信息日志表中:
```
CREATE TABLE [dbo].[person_log](
[id] [int] IDENTITY(1,1) NOT NULL,
[person_id] [int] NULL,
[log] [varchar](1000) NULL,
[created_date] [datetime] NOT NULL CONSTRAINT [DF_person_log_created_date] DEFAULT (getdate()),
CONSTRAINT [PK_person_log] PRIMARY KEY CLUSTERED
(
[id] ASC
) ON [PRIMARY]
)
GO
CREATE TRIGGER [dbo].[person_insert]
ON [dbo].[person]
AFTER INSERT, DELETE
AS
BEGIN
IF @@ROWCOUNT = 0 RETURN;
IF EXISTS (SELECT 1 FROM inserted)
BEGIN
INSERT INTO dbo.person_log (person_id, log) SELECT id, 'New person added.' FROM inserted;
END
IF EXISTS (SELECT 1 FROM deleted)
BEGIN
INSERT INTO dbo.person_log (person_id, log) SELECT id, 'Person deleted.' FROM deleted;
END
END;
GO
```
以上是 SQL Server 触发器的用法和案例说明。在使用触发器时需要注意,如果触发器中执行的 SQL语句有误,可能会影响到整个数据库。因此,在编写和修改触发器时要非常小心,并仔细检查语句是否正确。同时,建议仅在必要的情况下使用触发器,以保持数据库的性能和可维护性。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/
数人想要改造这个世界,但却罕有人想改造自己。
你要是长的不丑还真的挺漂亮的。