sql编程介绍触发器

触发器(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/

点赞(47) 打赏

评论列表 共有 2 条评论

い遥远了清晰的爱 1年前 回复TA

数人想要改造这个世界,但却罕有人想改造自己。

可爱又嚣张 1年前 回复TA

你要是长的不丑还真的挺漂亮的。

立即
投稿
发表
评论
返回
顶部