什么是触发器(trigger)? 触发器有什么作用?

发布网友 发布时间:2022-04-23 01:55

我来回答

2个回答

懂视网 时间:2022-04-08 13:24

/****** Object: Trigger [dbo].[部门_Delete] Script Date: 2015/8/31 16:41:46 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: <Author,Ammy,Name> -- Create date: <Create Date,,> -- Description: <Description,显示一次操作触发器修改了多少条记录,> --因为每个操作类型在一次操作时,对一个触发器只激活一次,但是运行的操作可能更新或删除了10条记录, --Inserted表和Deleted表里会有10条记录,用系统变量@@ROWCOUNT 可以得知上一次操作所更改的记录数 -- ============================================= CREATE TRIGGER [dbo].[部门_Delete] ON [test].[dbo].[部门表] AFTER DELETE AS BEGIN PRINT ‘您此次删除了‘+CAST(@@ROWCOUNT AS VARCHAR)+‘条记录‘ END GO

部门表_插入:

 

USE [test]
GO

/****** Object: Trigger [dbo].[部门_Insert] Script Date: 2015/8/31 16:42:29 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author: <Author,Ammy,Name>
-- Create date: <Create Date,2015/08/19,>
-- Description: <Description,部门表插入时发出提示:又添加了一种产品,并向日志表插入一条记录>
-- =============================================
CREATE TRIGGER [dbo].[部门_Insert]
ON [dbo].[部门表]
AFTER INSERT
AS
BEGIN
 DECLARE @事件部门名称 NVARCHAR(50)

 SELECT @事件部门名称=部门名称 FROM inserted

 IF(SELECT LEN(电话号码) FROM inserted )<>11
 BEGIN
  PRINT‘电话号码位数必须是11位‘
  ROLLBACK TRANSACTION
 END
 ELSE
 BEGIN
  print ‘又添加了一个部门‘
  INSERT INTO test.dbo.日志表(事件名,事件人,事件时间)VALUES(‘添加新部门:‘+@事件部门名称,‘admin‘,GETDATE());
  --设置此TRIGGER的嵌套类型为true,如果在 dbo.日志表 上建立触发器,会触发激活dbo.日志表_Insert 触发器
 END

END

GO

部门表_更新:

USE [test]
GO

/****** Object: Trigger [dbo].[部门表_只能修改部门编号] Script Date: 2015/8/31 16:43:17 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author: <Author,Ammy,Name>
-- Create date: <Create Date,2015-08-20,>
-- Description: <Description,用update(字段名),完成只能修改某字段的触发器>
-- =============================================
CREATE TRIGGER [dbo].[部门表_只能修改部门编号]
ON [dbo].[部门表]
Instead of UPDATE
AS
BEGIN
 SET NOCOUNT ON;
 IF UPDATE(部门编号)
 BEGIN
  DECLARE @部门编号 NVARCHAR(20),
   @部门名称 NVARCHAR(20),
   @部门职责 Nvarchar(20)

  SET @部门编号=(SELECT 部门编号 FROM inserted)
  SET @部门名称=(SELECT 部门名称 FROM inserted)
  SET @部门职责 =(SELECT 部门职责 FROM inserted)

  UPDATE 部门表 SET 部门编号=@部门编号
  WHERE 部门名称=@部门名称--AND 部门编号=@部门编号 AND @部门职责=@部门职责
  --这种写法很不好,因为只能操作的语句只能按这种修改才起作用
 END 
 ELSE
 BEGIN 
  PRINT ‘只能修改部门编号‘
  RAISERROR(‘除了部门编号之外的字段都不允许修改‘,16,5)
  --PRINT 输出自定义信息,但是只能在查询编辑器窗格中运行SQL语句才能看到这些自定义的信息,
  --而其他的前端应用程序都不会显示这些自定义的信息
 END
END


GO

日志表触发器:

USE [test]
GO

/****** Object: Trigger [dbo].[日志表_Insert] Script Date: 2015/8/31 16:44:11 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author: <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
CREATE TRIGGER [dbo].[日志表_Insert]
ON [test].[dbo].[日志表]
AFTER INSERT
AS 
BEGIN
 PRINT‘数据库又有记录变动了‘
END
 

GO

 

数据库触发器_trigger

标签:

热心网友 时间:2022-04-08 10:32

触发器是数据库中由一个时间触发的特殊的存储过程,他不是由程序条用也不是手工启动的。触发器的执行可以由对一个表的insert,delete, update等操作来触发,触发器经常用于加强数据的完整性约束和业务规则等等。触发器可以对其他表进行查询,也可以包含复杂的SQL语句。他么主要用于强*从复杂的业务规则或者要求。例如可以利用触发器根据客户当前的帐户状态来控制是否允许插入新的订单。触发器也可以用于强制引用完整性,以便在多个表中添加,删除或者更新数据时,保留这些表之间的关系。创建触发器的SQL语法:DELIMITER |CREATE TRIGGER `<databaseName`.`<triggerName`< [ BEFORE | AFTER ] < [ INSERT | UPDATE | DELETE ]ON <tableName

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com