酷酷娱乐网

站内广告

MySQL入门-- TRIGGER(触发器)

时间:2020-09-22 22:30:03   作者:酷酷娱乐网   来源:www.kukuyl.com  
内容摘要:


MySQL




TRIGGER



(触发器)





数据库触发器是数据库中所维护的命名数据......

MySQL  TRIGGER (触发器)

数据库触发器是数据库中所维护的命名数据库对象,将在修改表中数据时被激活。使用触发器可以提高表中数据的功能和安全性级别。可以使用触发器控制对特定数据的访问权限、执行特定日志记录或对数据本身进行审计。

触发器是在修改表数据时激活的命名数据库对象。它们可以:

Ø   在插入或更新数据之前对数据进行检查并验证删除和更新

Ø   充当数据过滤器,在插入或更新之前修改超出范围的数据

Ø   修改 INSERT UPDATE DELETE 的行为方式

Ø   对于不支持外键的存储引擎,模仿外键的行为

Ø   提供日志记录功能

Ø   自动创建汇总表

1.1.         创建触发器

CREATE TRIGGER 语句:

CREATE TRIGGER trigger_name

{ BEFORE | AFTER }

{ INSERT | UPDATE | DELETE }

ON table_name FOR EACH ROW

triggered_statement

示例:

CREATE TRIGGER City_AD AFTER DELETE

ON City FOR EACH ROW

INSERT INTO DeletedCity (ID, Name) VALUES (OLD.ID, OLD.Name);

trigger_name 是为触发器指定的名称,而 table_name 是要与触发器关联的表的名称。 BEFORE AFTER 指示激活触发器的时间(是在触发事件之前或是之后),而 INSERT UPDATE DELETE 指示具体的事件。

注:表名 OLD NEW 是指触发器可查看的虚拟表。这些表分别包含 UPDATE DELETE 语句所修改的数据的旧版本,或 INSERT UPDATE 语句所添加的数据的新版本。

 

1.2.         触发器事件

BEFORE AFTER

BEFORE AFTER 关键字是指触发器的激活时间,相对于数据修改语句( INSERT UPDATE DELETE )将更改写入底层数据库的时间。

BEFORE 关键字可使触发器在涉及的数据修改之前执行。可使用 BEFORE 触发器捕获无效数据条目并在写入表之前对其进行更正或拒绝。

BEFORE INSERT :在添加新数据之前触发

BEFORE UPDATE :在使用新数据更新(或覆盖)现有数据之前触发

BEFORE DELETE :在删除数据之前触发

AFTER 关键字定义在数据修改成功后执行的触发器。可使用 AFTER 触发器记录或审计数据库中的数据修改。

AFTER INSERT :在添加新数据之后触发

AFTER UPDATE :在使用新数据更新(或覆盖)现有数据之后触发

AFTER DELETE :在删除数据之后触发

 

1.3.         触发器错误处理

MySQL 按如下方式处理触发器执行期间发生的错误:

Ø   BEFORE 触发器失败,则包含相应行操作的事务将回滚。

Ø   AFTER 触发器执行, AFTER 触发器事件和行操作必须成功执行。

Ø   对于非事务表,事务不可用。只有触发了触发器的语句会回滚。

触发器失败后, MySQL 会回滚包含导致触发器触发的语句的事务。

对于非事务表,无法完成此类回滚。因此,虽然语句失败,但在发生错误之前执行的所有更改仍然会生效。

 

1.4.         检查触发器

SHOW CREATE TRIGGER trigger_name

此语句返回可用于重新创建指定触发器的具体字符串。您必须知道触发器的名称才能运行此语句;对于 SHOW CREATE TRIGGER 语句,不存在 LIKE WHERE 语法。

SHOW TRIGGERS

此语句为 MySQL 扩展。它可返回触发器的特征,如数据库、名称、类型、创建者以及创建和修改日期。此语句有一个优点:可基于 LIKE 模式或 WHERE 子句中提供的条件来显示特定触发器。如果未指定条件,则此语句会显示所有触发器的信息。

INFORMATION_SCHEMA.TRIGGERS

此语句包含 SHOW 命令所显示的所有数据,能够完整地呈现在所有数据库中可用的触发器。

 

1.5.         删除触发器

使用如下语法可显式删除触发器:

DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name;

使用 DROP TRIGGER trigger_name 时,服务器会在当前模式中查找该触发器的名称。如果要删除其他模式中的触发器,请包含模式名称。使用 IF EXISTS 可防止因尝试删除不存在的触发器而出现的错误。通过删除针对其定义触发器的表或者包含触发器的数据库,可隐式删除触发器;

 

1.6.         对触发器的限制

Ø   不允许使用的语句包括:

l   SQL 预处理语句

l   显示或隐式 COMMIT ROLLBACK

l   返回结果集的语句,例如,不包含 INTO var_list 子句的 SELECT 语句

l   FLUSH 语句

l   用于修改要应用触发器的表的语句

l   SHOW 语句

Ø   以下更改不会触发触发器:

l   级联外键所导致的更改

l   在基于行的复制过程中导致的更改

请通过使用 SELECT ...INTO var_list ,或者通过使用游标和 FETCH 语句的方法在触发器中处理结果集。

 

1.7.         触发器权限

Ø   要执行 CREATE TRIGGER DROP TRIGGER 命令,需要有 TRIGGER 权限。

Ø   在触发器中使用 OLD NEW 需要的权限:要使用 SET NEW.col_name = value 为列赋值,需要对该列拥有 UPDATE 权限;要在表达式中使用 NEW.col_name 以引用新的列值,需要对该列拥有 SELECT 权限。


本文章url:https://www.kukuyl.com/new/30000836.html

相关文章

本栏最新更新

本栏推荐

阅读排行

CopyRight 2018 - 2020 http://www.kukuyl.com 酷酷娱乐网 All Rights Reserved .