一.MySQL上触发器的使用
示例:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 CREATE TRIGGER trigger_name 2 trigger_time 3 trigger_event ON tbl_name 4 FOR EACH ROW 5 trigger_stmt
trigger_name:标识触发器名称,用户自行指定;
trigger_time:标识触发时机,取值为 BEFORE 或 AFTER;
trigger_event:标识触发事件,取值为 INSERT、UPDATE 或 DELETE;
tbl_name:标识建立触发器的表名,即在哪张表上建立触发器;
trigger_stmt:触发器程序体,可以是一句SQL语句,或者用 BEGIN 和 END 包含的多条语句。
由此可见,可以建立6种触发器,即:BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE、AFTER INSERT、AFTER UPDATE、AFTER DELETE。
另外有一个限制是不能同时在一个表上建立2个相同类型的触发器,因此在一个表上最多建立6个触发器。
trigger_event 详解
MySQL 除了对 INSERT、UPDATE、DELETE 基本操作进行定义外,还定义了 LOAD DATA 和 REPLACE 语句,这两种语句也能引起上述6中类型的触发器的触发。
LOAD DATA 语句用于将一个文件装入到一个数据表中,相当与一系列的 INSERT 操作。
REPLACE 语句一般来说和 INSERT 语句很像,只是在表中有 primary key 或 unique 索引时,如果插入的数据和原来 primary key 或 unique 索引一致时,会先删除原来的数据,然后增加一条新数据,也就是说,一条 REPLACE 语句有时候等价于一条。
INSERT 语句,有时候等价于一条 DELETE 语句加上一条 INSERT 语句。
INSERT 型触发器:插入某一行时激活触发器,可能通过 INSERT、LOAD DATA、REPLACE 语句触发;
UPDATE 型触发器:更改某一行时激活触发器,可能通过 UPDATE 语句触发;
DELETE 型触发器:删除某一行时激活触发器,可能通过 DELETE、REPLACE 语句触发。
实际使用:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 触发器-- 在给firsttable插入一条数据的同时 给secondtable插入相同的数据 3 */ 4 CREATE TRIGGER cfq_insert_one 5 AFTER 6 INSERT 7 ON firsttable FOR EACH ROW 8 INSERT INTO secondtable SET firstname = new.firstName;/*new.firstName 就是新增加的数据*/ 9 /*展示 目标表上的触发器*/ 10 SHOW TRIGGERS LIKE 'firsttable'; 11 12 INSERT INTO firsttable VALUES ('李思');
如果,如果你打算执行多个语句,可使用BEGIN ... END复合语句结构。
示例如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 CREATE TRIGGER testref BEFORE INSERT ON test1 2 FOR EACH ROW BEGIN 3 INSERT INTO test2 SET a2 = NEW.a1; 4 DELETE FROM test3 WHERE a3 = NEW.a1; 5 UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1; 6 END
二.SQL Server上的触发器 简单使用
首先了解一下 SQL Server中的 触发器的基本语法:
1.创建触发器
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 create trigger trigger_name 2 3 on {table_name | view_name} 4 5 {for | After | Instead of } 6 7 [ insert, update,delete ] 8 9 as 10 11 sql_statement
2.删除触发器
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 drop trigger trigger_name
3.查看已有的触发器
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 SELECT * FROM Sysobjects WHERE xtype = 'TR'
4.查看单个触发器
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 exec sp_helptext '触发器名'
接下来 展示一下简单使用的例子:
1.创建两个数据表用来 测试
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 CREATE TABLE [dbo].[tableA]( 2 [name] [nchar](10) NULL, 3 [age] [int] NULL 4 ) ON [PRIMARY]
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 CREATE TABLE [dbo].[tableB]( 2 [id] [int] NULL, 3 [age] [int] NULL 4 ) ON [PRIMARY] 5 6 GO
查看某个数据表的 创建语句 可以试用一下的方法:
2.创建触发器 --> 测试触发器 --> 删除触发器 --> 展示触发器
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /*创建 触发器--在tableA上创建insert触发器*/ 2 create trigger after_insert_tableA 3 on tableA 4 for insert 5 as 6 declare @oldId int,@newage int /*定义自定义的变量*/ 7 select @oldId = Max(id) from tableB /*为自定义的变量 赋值*/ 8 select @newage = age from inserted /*inserted表是 触发器里的临时表之一*/ 9 10 if(@oldId is null) 11 begin 12 insert into tableB values ( 1,@newage); 13 end 14 else 15 insert into tableB values ( @oldId+1,@newage); 16 17 18 insert into tableA values('马六',16); 19 select * from tableA; 20 select * from tableB; 21 22 /*查看单个触发器*/ 23 exec sp_helptext 'after_insert_tableA' 24 25 /*删除 触发器*/ 26 drop trigger after_insert_tableA; 27 /*查看已有的触发器*/ 28 SELECT * FROM Sysobjects WHERE xtype = 'TR'