My SQL - 触发器

触发器

​ 触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行。

​ 可以使用触发器来进行审计跟踪,把修改记录到另外一张表中。

​ MySQL 不允许在触发器中使用 CALL 语句 ,也就是不能调用存储过程。

​ 注意:在 MySQL 中,分号 ; 是语句结束的标识符,遇到分号表示该段语句已经结束,MySQL 可以开始执行了。因此,解释器遇到触发器执行动作中的分号后就开始执行,然后会报错,因为没有找到和 BEGIN 匹配的 END。

​ 这时就会用到 DELIMITER 命令(DELIMITER 是定界符,分隔符的意思)。它是一条命令,不需要语句结束标识,语法为:DELIMITER new_delemiter。new_delemiter 可以设为 1 个或多个长度的符号,默认的是分号 ;,我们可以把它修改为其他符号,如 $ - DELIMITER $ 。在这之后的语句,以分号结束,解释器不会有什么反应,只有遇到了 $,才认为是语句结束。注意,使用完之后,我们还应该记得把它给修改回来。

BEGIN 和 END

​ 当触发器的触发条件满足时,将会执行 BEGIN 和 END 之间的触发器执行动作。

NEW 和 OLD

  • MySQL 中定义了 NEW 和 OLD 关键字,用来表示触发器的所在表中,触发了触发器的那一行数据。
  • 在 INSERT 型触发器中,NEW 用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
  • 在 UPDATE 型触发器中,OLD 用来表示将要或已经被修改的原数据,NEW 用来表示将要或已经修改为的新数据;
  • 在 DELETE 型触发器中,OLD 用来表示将要或已经被删除的原数据;
  • 使用方法:NEW.columnName (columnName 为相应数据表某一列名)

创建触发器

​ CREATE TRIGGER 指令用于创建触发器。

CREATE TRIGGER trigger_name
trigger_time
trigger_event
ON table_name
FOR EACH ROW
BEGIN
  trigger_statements
END;

​ 说明:

  • trigger_name:触发器名
  • trigger_time: 触发器的触发时机。取值为 BEFORE 或 AFTER。
  • trigger_event: 触发器的监听事件。取值为 INSERT、UPDATE 或 DELETE。
  • table_name: 触发器的监听目标。指定在哪张表上建立触发器。
  • FOR EACH ROW: 行级监视,Mysql 固定写法,其他 DBMS 不同。
  • trigger_statements: 触发器执行动作。是一条或多条 SQL 语句的列表,列表内的每条语句都必须用分号 ; 来结尾。
--示例:
DELIMITER $
CREATE TRIGGER `trigger_insert_user`
AFTER INSERT ON `user`
FOR EACH ROW
BEGIN
    INSERT INTO `user_history`(user_id, operate_type, operate_time)
    VALUES (NEW.id, 'add a user', now());
END $
DELIMITER ;

查看触发器

SHOW TRIGGERS;

删除触发器

DROP TRIGGER IF EXISTS trigger_insert_user;
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL触发器是一种特殊的存储过程,它在特定的数据库事件发生时自动执行。在物联网大赛中,SQL触发器可以用于监测设备数据的变化,从而自动触发某些操作,例如发送警报、更新设备状态等。 以下是一个简单的示例,演示如何在SQL Server中创建一个触发器,以在设备状态更新时发送电子邮件通知: ``` CREATE TRIGGER tr_device_status_update ON dbo.Device AFTER UPDATE AS BEGIN IF UPDATE(Status) BEGIN DECLARE @device_id INT DECLARE @status VARCHAR(50) SELECT @device_id = i.DeviceID, @status = i.Status FROM inserted i INNER JOIN deleted d ON i.DeviceID = d.DeviceID IF (@status = 'Offline') BEGIN EXEC msdb.dbo.sp_send_dbmail @profile_name = 'NotificationEmail', @recipients = 'admin@mycompany.com', @subject = 'Device Offline', @body = 'Device ' + CAST(@device_id AS VARCHAR(10)) + ' is now offline.' END END END ``` 在此示例中,我们创建了一个名为tr_device_status_update的触发器,它将在Device表中的任何更新操作之后自动触发。我们使用IF UPDATE(Status)语句来检查状态列是否已更改,然后使用INSERTED和DELETED表来获取更新前后的设备状态。如果设备状态从“在线”更改为“离线”,则触发器将使用sp_send_dbmail存储过程发送电子邮件通知给管理员。 这只是一个简单的示例,你可以根据自己的需求和数据库平台的不同,创建更复杂的SQL触发器来实现物联网应用程序中的自动化任务和通知。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值