SQL 触发器

Posted Angel挤一挤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL 触发器相关的知识,希望对你有一定的参考价值。

一.mysql上触发器的使用

 

示例:

1 CREATE TRIGGER trigger_name
2 trigger_time
3 trigger_event ON tbl_name
4 FOR EACH ROW
5 trigger_stmt
View Code

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 语句触发。

 

实际使用:

 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 (\'李思\');
View Code

 

如果,如果你打算执行多个语句,可使用BEGIN ... END复合语句结构。

示例如下:

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
View Code

 

 

 

 

二.SQL Server上的触发器 简单使用

首先了解一下 SQL Server中的 触发器的基本语法:

1.创建触发器

 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
View Code

2.删除触发器

1 drop trigger trigger_name
View Code

3.查看已有的触发器

1 SELECT * FROM Sysobjects WHERE xtype = \'TR\'
View Code

4.查看单个触发器

1 exec sp_helptext \'触发器名\'
View Code

 

 

 

接下来  展示一下简单使用的例子:

1.创建两个数据表用来 测试

1 CREATE TABLE [dbo].[tableA](
2     [name] [nchar](10) NULL,
3     [age] [int] NULL
4 ) ON [PRIMARY]
View Code
1 CREATE TABLE [dbo].[tableB](
2     [id] [int] NULL,
3     [age] [int] NULL
4 ) ON [PRIMARY]
5 
6 GO
View Code

查看某个数据表的 创建语句 可以试用一下的方法:

 

2.创建触发器 --> 测试触发器   -->   删除触发器 -->   展示触发器

 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\'
View Code

 

以上是关于SQL 触发器的主要内容,如果未能解决你的问题,请参考以下文章

(十七)PL/SQL DBMS输出

如何设置 vscode 的代码片段,以便在自动完成后自动触发 vscode 的智能感知?

使用触发器对学生表操作进行日志记录

SQL记录-PLSQL-DBMS输出

片段创建的 Intent 不会触发 onNewIntent

sql sql里面的代码片段