MySQL触发器

合集下载

如何使用MySQL的触发器实现审计与日志记录

如何使用MySQL的触发器实现审计与日志记录

如何使用MySQL的触发器实现审计与日志记录导语:MySQL是一种常用的关系型数据库管理系统,能够支持大规模的数据存储和处理,并提供了多种功能和特性来满足各种需求。

其中,触发器是MySQL中特性之一,它可以在特定的事件(例如插入、更新或删除操作)发生时自动执行一系列的操作。

本文将探讨如何使用MySQL的触发器功能来实现审计与日志记录,以帮助开发人员更好地追踪和监控数据库的活动。

一、触发器简介1.1 触发器的定义在MySQL中,触发器是一种与表相关联的数据库对象,当表上的某个事件(如插入、更新或删除操作)发生时,触发器可以自动地执行一系列的SQL语句。

1.2 触发器的类型MySQL中的触发器可以分为三种类型:BEFORE触发器、AFTER触发器和INSTEAD OF触发器。

BEFORE触发器在执行触发事件之前被激活;AFTER触发器在执行触发事件之后被激活;INSTEAD OF触发器在触发事件被执行之前被激活,而且可以在触发事件之前改变数据。

二、审计与日志记录需求2.1 数据库审计的重要性数据库是组织和存储大量敏感信息的重要组成部分。

因此,确保数据库的安全性和稳定性对于组织来说非常关键。

审计是一种监控和追踪数据库活动的方法,可以帮助组织及时发现和解决潜在的安全问题,并提供法定要求中日志记录的证据。

2.2 日志记录的作用作为数据库管理人员,我们不仅需要监控数据库的活动,还需要记录这些活动信息以备后续分析和审查。

日志记录可以提供一份详细的操作历史,使我们能够追溯到每个数据库对象的变更和操作,从而更好地了解数据库的使用情况和变化趋势。

三、使用触发器实现审计与日志记录3.1 创建审计表首先,我们需要创建一个用于记录审计信息的表。

该表应包含必要的字段,如时间戳、用户名、操作类型、受影响的表和行等。

3.2 创建BEFORE触发器以插入操作为例,我们可以创建一个BEFORE INSERT触发器来拦截插入操作,并将相关信息记录到审计表中。

MySQL中的触发器和存储过程的区别与用途

MySQL中的触发器和存储过程的区别与用途

MySQL中的触发器和存储过程的区别与用途MySQL是一种常用的关系型数据库管理系统,广泛应用于各种互联网应用中。

在MySQL中,触发器(Trigger)和存储过程(Stored Procedure)是两种常见的编程方式,用于实现数据库操作的自动化和业务逻辑的封装。

本文将探讨MySQL中的触发器和存储过程的区别和用途。

一、触发器触发器是MySQL中一种特殊的数据库对象,它和数据库表关联,并在表中的指定事件发生时自动执行特定的操作。

触发器是基于事件驱动的,它可以在数据插入、更新或删除时触发执行相应的操作。

1. 触发器的创建在MySQL中,创建触发器需要使用CREATE TRIGGER语句,并指定触发时机、触发事件、触发操作和触发操作所执行的SQL语句。

例如,我们可以创建一个在数据插入前触发的触发器如下所示:```CREATE TRIGGER before_insert_triggerBEFORE INSERT ON table_nameFOR EACH ROWBEGIN-- 触发操作所执行的SQL语句...END;```2. 触发器的用途触发器可以用于各种场景,例如数据自动更新、数据约束、数据一致性等。

下面以一个实例来说明触发器的用途。

假设我们有一个订单表和一个库存表,每当有订单数据插入时,我们希望自动更新库存表中对应商品的库存数量。

这时,就可以使用触发器实现该功能。

```CREATE TRIGGER update_inventoryAFTER INSERT ON ordersFOR EACH ROWBEGINUPDATE inventorySET quantity = quantity - NEW.amountWHERE product_id = NEW.product_id;END;```在上述示例中,我们创建了一个名为update_inventory的触发器,它在订单表插入数据后触发,然后执行更新库存表的操作。

MySQL数据库应用与开发技术 第8章 触发器

MySQL数据库应用与开发技术 第8章 触发器
• 如果修改后的值大于100,则值为100 • 如果修改后的值小于0,则值为0 • 如果修改后的值为旧值2倍以上,则值为旧值2倍
19
建表脚本
➢ CREATE DATABASE IF NOT EXISTS mydb; ➢ USE mydb;
➢ DROP TABLE IF EXISTS `account`; ➢ CREATE TABLE `account` ( ➢ `id` int(10) unsigned NOT NULL auto_increment, ➢ `user` varchar(45) NOT NULL, ➢ `amount` int(11) NOT NULL default '0', ➢ PRIMARY KEY (`id`) ➢ ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; ➢ INSERT INTO `account` (`id`,`user`,`amount`) VALUES ➢ (1,'李知龙',55), ➢ (2,'卢中明',80), ➢ (3,'乔大平',30);
• 可在before触发器中赋值、取值 • 可在after触发器中取值
old
• 只能用于取值,因为赋值没意义
INSERT语句,只有new合法 DELETE语句,只有old才合法 UPDATE语句,可以同时使用new和old
18
课程练习2
➢ 创建触发器:
upd_check
➢ 功能作用:
修改Account表中的记录的amount字段时,作如下检查:
4
触发器作用
➢ 数据约束
实现数据完整性检查和约束

mysql_触发器、函数、if的使用

mysql_触发器、函数、if的使用

mysql_触发器、函数、if的使⽤触发器在当前的表上,设置⼀个对每⾏数据的⼀个监听器,监听相关事件,每当事件触发时,就会执⾏⼀段由sql完成的⼀段功能代码触发事件:insert, delete, updatenew old : 针对的是触发的那张表 on 表名insert :没有 old 有new 【对于插⼊,插⼊之前什么都没有,插⼊之后才有数据】update : 有old 有newdelete : 有old 没有new因为数据的改变不是固定,所以需要获取触发程序时的数据old: 表⽰事件发⽣之前的数据, 旧的数据new: 表⽰事件发⽣之后的数据, 新的数据事件的时机: after(表⽰执⾏之后), before(表⽰执⾏之前);事件和时机组合在⼀起⼀共有六种事件before insert, before delete, before updateafter insert, after delete, after update监听的地点: table(表),事件规定在哪个表上的哪个时机的什么动作上**************************************************************************************************创建触发器语法格式create trigger trigger_name [六种情况] on table_namefor each rowbeginsql statement;end;删除触发器drop trigger trigger_name;查看触发器select trigger_name from `information_schema`.TRIGGERS;***************************************************************************************************drop table if exists seller;create table seller(name varchar(30),money double(8,2));insert into seller values('狗娃', 5000);drop table if exists buyer;create table buyer(name varchar(30),money double(8,2));insert into buyer values('狗蛋', 1000);例: 创建触发器drop trigger if exists tr_buyer;delimiter $$create trigger tr_buyer after update on buyerfor each rowbeginupdate seller set money = money + 10;end$$delimiter ;update buyer set money = money - 10;例: 查看触发器select trigger_name from `information_schema`.TRIGGERS;例: 删除触发器drop trigger [if exists] tr_buyer;**************************************************************************************************例: 创建触发器drop trigger if exists tr_buyer;delimiter $$create trigger tr_buyer after update on buyerfor each rowbegin# update seller set money = money + (买家原有的钱 - 买家现在的钱) '买家买东西的钱'; update seller set money = money + (old.money - new.money);end$$delimiter ;update buyer set money = money - 1000;例: drop trigger if exists tr_buyer;delimiter $$create trigger tr_buyer before update on buyerfor each rowbeginif new.money >= 0 thenupdate seller set money = money + (old.money - new.money);elseSIGNAL SQLSTATE 'HY000' set MESSAGE_TEXT = '您的⾦钱不⾜';end if;end$$delimiter ;update buyer set money = money - 2;--如果事件是insert, 则只有new没有olddrop trigger if exists tr_buyer;delimiter $$create trigger tr_buyer before insert on buyerfor each rowbegininsert into seller values(, old.money); #报错end$$delimiter ;insert into buyer values('狗剩', 1000)--如果事件是delete,则只有old没有newdrop trigger if exists tr_buyer;delimiter $$create trigger tr_buyer before delete on buyerfor each rowbegininsert into seller values(, new.money); #报错end$$delimiter ;delete from buyer where name = '狗蛋';ps: 触发器不能同名现在mysql只⽀持⼀类事件设置⼀个触发器--充钱取钱create table yaoye(id int primary key auto_increment,name char(80),age tinyint(4) unsigned);create table fd(fid int primary key,fname char(80),fage tinyint(4) unsigned);针对⼀个帐号存钱取钱当往yaoye 存钱的时候,要在fd显⽰出来drop trigger if exists mtri;delimiter $$ #更改默认的结束符号为 $$create trigger mtri before update on yaoye for each rowbegindeclare nowMoney float; # 申明⼀个变量nowMoney ,数据类型是floatselect ymoney into nowMoney from yaoye where id = 1;if(old.ymoney - new.ymoney < nowMoney)thenupdate fd set fmoney = fmoney - ( old.ymoney - new.ymoney ) where fid = new.id; # new.ymoney 现在的钱 , old.ymoney 原先的钱elseif(old.ymoney - new.ymoney > nowMoney)thenset new.ymoney = old.ymoney; #end if;end $$delimiter ;if()then ;elseifthenelseifthen ...;elsesql代码end if;*************************************************************************************************************mysql函数条件判断函数1: if(expr, v1, v2): 如果expr这个条件成⽴,则执⾏v1,否则执⾏v2;例: select if(1=0, 1, 0);2: case when expr1 then v1when expr2 then v2else v3 end例: select stu_no, stu_sex, case when stu_sex='男' then concat(stu_name,'⼤帅哥')when stu_sex='⼥' then concat(stu_name,'⼩美⼥')else stu_name end as '姓名'from student;系统信息函数1: select version(); 获取数据库系统版本号2: select connection_id(); 获取数据库连接数3: select database()/schema(); 获取当前数据库4: select user(); 获取当前⽤户名加密函数1: select password(str) 对str加密2: select md5(str) 对str进⾏md5的加密其它1: inet_aton(ip) 把ip转化为数值来表⽰例: select inet_aton('192.16.70.100');2: inet_ntoa(n) 把⼀个数值转化ip例: select inet_ntoa(3222292068);⾃定义函数(函数不能返回结果集)语法格式: create function 函数名(参数列表) returns 返回值类型begin函数体;end;例: ⾃定义⼀个返回矩形的⾯积的函数delimiter $$create function rectangle_area(w double, h double) returns doublebegindeclare value double default 0;set value := w*h;return value;end$$delimiter ;调⽤: select rectangle_area(3, 100);⾃定义函数: 因为官⽅函数是有限的,所以特殊的需求需要⾃⼰创造语法【不带参数】:drop function if exists 函数的名字;delimiter $$create function 函数的名字()returns 数据类型beginsql语句块end $$delimiter ;语法【带参数】:drop function if exists 函数的名字;delimiter $$create function 函数的名字(参数名字1 数据类型1,参数名字2 数据类型2.....)returns 数据类型beginsql语句块end $$delimiter ;eg:drop function if exists xiaokun;delimiter $$create function xiaokun()returns varchar(100)beginreturn "风度迷彩你好帅!!帅的我想揍你!!";end $$delimiter ;怎么调⽤select 函数名();monkey(num1,num2,opeart);select monkey(23,45,"+");select monkey(10,45,"*");select monkey(16,8,"-");select monkey(16,8,"/");drop function if exists monkey;delimiter $$create function monkey(num1 float,num2 float,opeart varchar(100))returns float begindeclare ope varchar(80); # 申明变量ope,数据类型是 varchar(80)select trim(opeart) into ope; # 将opeart的值赋给 opeif(ope != "")thenif(ope = "+")then return num1 + num2;elseif(ope = "-")then return num1 - num2;elseif ope = "*"then return num1 * num2;elseif ope = "/"then return num1 / num2;end if;elsereturn 0;end if;end $$delimiter ;查看函数select type, db, name from mysql.proc;select type, db, name from mysql.proc where type = 'FUNCTION';删除函数drop function rectangle_area;---------------------作者:Casablanca_jhBi来源:CSDN原⽂:https:///weixin_37243717/article/details/79090304版权声明:本⽂为博主原创⽂章,转载请附上博⽂链接!。

mysql trigger用法

mysql trigger用法

mysql trigger用法MySQL触发器(Trigger)是一种与表关联的数据库对象,当满足特定条件时自动执行。

触发器可以在插入、更新或删除操作之前或之后触发。

以下是MySQL触发器的基本用法:1. 创建触发器:```sqlCREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROWBEGIN-- 触发器执行的SQL语句END;```其中:* `trigger_name` 是触发器的名称。

* `trigger_time` 是触发的时间,可以是 `BEFORE` 或 `AFTER`。

* `trigger_event` 是触发的事件,可以是 `INSERT`、`UPDATE` 或`DELETE`。

* `table_name` 是与触发器关联的表名。

* `FOR EACH ROW` 表示触发器对每一行数据都执行一次。

2. 示例:假设我们有一个名为 `orders` 的表,其中包含 `order_id`、`customer_id` 和 `order_date` 列。

我们希望在插入新的订单时自动将订单日期设置为当前日期。

```sqlCREATE TRIGGER set_order_date_trigger BEFORE INSERT ON orders FOR EACH ROWBEGINSET NEW.order_date = CURDATE();END;```上述触发器会在向 `orders` 表插入新行之前,将 `order_date` 列设置为当前日期。

3. 删除触发器:```sqlDROP TRIGGER IF EXISTS trigger_name;```4. 查看触发器:可以使用以下命令查看当前数据库中的所有触发器:```sqlSHOW TRIGGERS;```5. 注意:* 触发器是一种强大的功能,可以用于实现各种复杂的业务逻辑。

sqlserver mysql的触发器语法

sqlserver mysql的触发器语法

SQL Server 和MySQL 的触发器语法有所不同。

下面分别介绍两者的触发器语法。

1.SQL Server 触发器语法:在SQL Server 中,触发器是一种数据库对象,它与表相关联,当表上发生特定事件(如INSERT、UPDATE 或DELETE)时,触发器就会被触发。

以下是SQL Server 触发器的基本语法:解释:•trigger_name是触发器的名称,可以根据需要自行定义。

•table_name是触发器所关联的表名。

•event_type是触发器所关联的事件类型,可以是INSERT、UPDATE或DELETE。

•column_list是触发器所关联的列名列表,如果触发器与所有列相关联,则可以省略列名列表。

•BEGIN和END之间是触发器的逻辑代码块。

2.MySQL 触发器语法:在MySQL 中,触发器是与表相关联的数据库对象,当满足特定条件时,触发器会自动执行预定义的操作。

以下是MySQL 触发器的基本语法:解释:•trigger_name是触发器的名称,可以根据需要自行定义。

•trigger_time是触发器的时间,可以是BEFORE或AFTER。

•trigger_event是触发器的操作事件,可以是INSERT、UPDATE或DELETE。

•table_name是触发器所关联的表名。

•FOR EACH ROW表示触发器将为每一行执行预定义的操作。

•BEGIN和END之间是触发器的逻辑代码块。

需要注意的是,SQL Server 和MySQL 的触发器语法在细节上可能略有不同,上述示例仅展示了基本的语法结构。

在实际使用中,请根据具体的数据库版本和需求进行适当的调整。

MySQL中的触发器和存储过程的调试方法

MySQL中的触发器和存储过程的调试方法

MySQL中的触发器和存储过程的调试方法MySQL中的触发器和存储过程是开发中经常使用的功能。

它们可以帮助我们在数据库层面上实现复杂的业务逻辑和数据操作。

然而,当出现问题时,我们可能会遇到调试的困难。

在本文中,我们将讨论一些MySQL中触发器和存储过程的调试方法。

一、调试触发器1. 使用日志输出MySQL提供了一个用于输出日志的语句:SELECT、INSERT、UPDATE或DELETE语句的执行结果可以通过调用SELECT LAST_INSERT_ID()、ROW_COUNT()或FOUND_ROWS()函数来获取,并将这些结果写入到日志中。

通过在触发器中添加这些输出,我们可以追踪触发器的执行过程和结果。

2. 使用信号调试MySQL提供了信号机制,可以在触发器中使用SIGNAL语句来发送信号。

例如,我们可以在触发器中添加一行代码:SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'My debug message'。

当触发器执行到这行代码时,会发送一个45000状态的信号,并抛出一个异常。

我们可以通过捕获这个异常来获取触发器的调试信息。

3. 使用临时表有时候,我们希望在触发器中查看某些中间结果或变量的值。

为了实现这个目的,我们可以在触发器中创建一个临时表,并将值插入到这个表中。

然后,在调试的过程中,我们可以通过查询这个临时表来查看这些值。

二、调试存储过程1. 使用DECLARE语句在存储过程中,我们可以使用DECLARE语句来声明一个变量。

我们可以在存储过程的不同部分使用SELECT语句来打印变量的值。

通过在关键位置添加这些SELECT语句,我们可以在存储过程执行的过程中观察变量的变化。

2. 使用调试器MySQL提供了一个存储过程调试器,可以通过在存储过程中使用CALL DEBUG()语句来启动调试器。

调试器可以让我们逐步执行存储过程,并在每个步骤中查看变量的值和执行的语句。

mysql触发器写法

mysql触发器写法

mysql触发器写法MySQL触发器是一种在指定的表上自动执行的数据库对象。

它能够在特定的操作(insert、update、delete)发生时,自动触发相应的动作。

本文将介绍MySQL触发器的写法,并提供参考内容。

MySQL触发器的写法如下:```CREATE TRIGGER trigger_nameAFTER/BEFORE INSERT/UPDATE/DELETE ON table_name FOR EACH ROWBEGIN-- 触发器动作END;```触发器包含以下几个关键部分:1. 触发器名称(trigger_name):触发器的名称,用于区分不同的触发器。

2. 触发时间(AFTER/BEFORE):指定触发器在所指定的操作(INSERT/UPDATE/DELETE)之前或之后执行。

3. 触发事件表(table_name):指定触发器所属的表。

4. 触发条件(FOR EACH ROW):触发器执行的条件,常用于指定仅对受影响的行执行触发器。

5. 触发器动作(BEGIN...END):触发器要执行的操作,在BEGIN和END之间编写具体的SQL语句。

下面是一个示例,演示了如何创建一个在插入数据之后自动更新指定表的修改时间的触发器:```CREATE TRIGGER update_modified_timeAFTER INSERT ON my_tableFOR EACH ROWBEGINUPDATE my_table SET modified_time = NOW() WHERE id = NEW.id;END;```在这个例子中,`update_modified_time`是触发器的名称,`AFTER INSERT`表示在进行插入操作之后触发,`my_table`是要触发器所属的表,`FOR EACH ROW`表示对每一行都执行触发器动作。

在BEGIN和END之间的SQL语句将更新`my_table`表中指定行的`modified_time`字段。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MySQL 5.0 触发器MySQL 5.0 新特性系列 C 第 2 部分MySQL 技术白皮书Peter GulutzanMarch, 2005 翻译:陈朋奕毕业于西安电子科技大学现泛华讯电脑技术版权说明版权说明::本手册参考之原文本手册参考之原文的版权属的版权属 MySQL AB,而本手册可自由使用而本手册可自由使用、、修改修改、、散发散发、、转载和商业用途转载和商业用途,, 但必须保留译者署名但必须保留译者署名。

由此引发的版权问题由此引发的版权问题,,译者不负责任译者不负责任。

(btw :可能会有错别字或错误可能会有错别字或错误,,但不影响阅读但不影响阅读)) Cop yright 2005, MySQL ABTable of ContentsIntroduction (3)Conventions and Styles (3)Why Triggers (3)1. Syntax: Name (4)2. Syntax: Time (5)3. Syntax: Event (5)4. Syntax: Table (5)5. Syntax: Granularity (5)6. Syntax: Statement (6)Privileges (6)Referring to OLD and NEW columns (6)Example of CREATE and INSERT (7)Example of a "check" constraint (7)Conclusion (9)About MySQL (9)Copyri ght 2005, MySQL AB Page 2Introduction本书是为需要了解5.0版本新特性的MySQL老用户而写的。

简单的来说介绍了“存储过程、触发器、视图、信息架构视图”,这是介绍MySQL 5.0新特性丛书的第一集。

希望这本书能像内行专家那样与您进行对话,用简单的问题、例子让你学到需要的知识。

为了达到这样的目的,我会从每一个细节开始慢慢的为大家建立概念,最后会给大家展示较大的实用用例,在学习之前也许大家会认为这个用例很难,但是只要跟着课程去学,相信很快就能掌握。

,我会对mysql客户端的屏幕就出现的代码进行调整,将字体改成Courier,使他们看起来与普通文本不一样(让大家区别程序代码和正文)。

在这里举个例子:mysql> DROP FUNCTION f;Query OK, 0 rows affected (0.00 sec)如果实例比较大,则需要在某些行和段落间加注释,同时我会用将“<--”符号放在页面的右边以表示强调。

例如:mysql> CREATE PROCEDURE p ()-> BEGIN-> /* This procedure does nothing */ <---> END;//Query OK, 0 rows affected (0.00 sec)有时候我会将例子中的"mysql>"和"->"这些系统显示去掉,你可以直接将代码复制到mysql客户端程序中(如果你现在所读的不是电子版的,可以在网站下载相关脚本)所以的例子都已经在Suse 9.2 Linux、Mysql 5.0.3公共版上测试通过。

在您阅读本书的时候,Mysql已经有更高的版本,同时能支持更多OS了,包括Windows,Sparc,HP-UX。

因此这里的例子将能正常的运行在您的电脑上。

但如果运行仍然出现故障,可以咨询你认识的资深Mysql 用户,这样就能得到比较好的支持和帮助。

Why Triggers 为什么要用触发器我们在MySQL 5.0中包含对触发器的支持是由于以下原因:MySQL早期版本的用户长期有需要触发器的要求。

我们曾经许诺支持所有ANSI 标准的特性。

您可以使用它来检查或预防坏的数据进入数据库。

您可以改变或者取消INSERT, UPDATE以及DELETE语句。

您可以在一个会话中监视数据改变的动作。

Copyri ght 2005, MySQL AB Page 3在这里我假定大家都读过“MySQL 新特性”丛书的第一集——“MySQL 存储过程”,那么大家都应该知道MySQL至此存储过程和函数,那是很重要的知识,因为在触发器中你可以使用在函数中使用的语句。

特别举个例子:复合语句(BEGIN / END) 是合法的.流控制(Flow-of-control)语句(IF, CASE, WHILE, LOOP, WHILE, REPEAT, LEAVE,ITERATE) 也是合法的.变量声明(DECLARE) 以及指派(SET) 是合法的.允许条件声明.异常处理声明也是允许的.但是在这里要记住函数有受限条件: 不能在函数中访问表. 因此在函数中使用以下语句是非法的。

ALTER 'CACHE INDEX' CALL COMMIT CREATE DELETEDROP 'FLUSH PRIVILEGES' GRANT INSERT KILLLOCK OPTIMIZE REPAIR REPLACE REVOKEROLLBACK SAVEPOINT 'SELECT FROM table''SET system variable' 'SET TRANSACTION'SHOW 'START TRANSACTION' TRUNCATE UPDATE在触发器中也有完全一样的限制.触发器相对而言比较新,因此会有(bugs)缺陷. 所以我在这里给大家警告,就像我在存储过程书中所说那样. 不要在含有重要数据的数据库中使用这个触发器,如果需要的话在一些以测试为目的的数据库上使用,同时在你对表创建触发器时确认这些数据库是默认的。

Syntax 语法1. Syntax: Name 语法语法::命名规则CREATE TRIGGER <触发器名称> <--{ BEFORE | AFTER }{ INSERT | UPDATE | DELETE }ON <表名称>FOR EACH ROW<触发器SQL语句>触发器必须有名字,最多64个字符,可能后面会附有分隔符. 它和MySQL中其他对象的命名方式基本相象.这里我有个习惯:就是用表的名字+'_'+触发器类型的缩写. 因此如果是表t26,触发器是在事件UPDATE (参考下面的点(2)和(3))之前(BEFORE)的,那么它的名字就是t26_bu 。

Copyri ght 2005, MySQL AB Page 42. Syntax: Time 语法语法::触发时间CREATE TRIGGER <触发器名称>{ BEFORE | AFTER } <-- { INSERT | UPDATE | DELETE } ON <表名称> FOR EACH ROW <触发的SQL 语句>触发器有执行的时间设置:可以设置为事件发生前或后。

3. Syntax: Event 语法语法::事件CREATE TRIGGER <触发器名称> { BEFORE | AFTER }{ INSERT | UPDATE | DELETE } <-- ON <表名称> FOR EACH ROW <触发的SQL 语句>同样也能设定触发的事件:它们可以在执行insert 、update 或delete 的过程中触发。

4. Syntax: Table 语法语法::表CREATE TRIGGER <触发器名称> { BEFORE | AFTER }{ INSERT | UPDATE | DELETE } ON <表名称> <-- FOR EACH ROW <触发的SQL 语句>触发器是属于某一个表的: 当在这个表上执行插入、更新或删除操作的时候就导致触发器的激活. 我们 不能给同一张表的同一个事件安排两个触发器。

5. Syntax: Granularity 语法语法:(:(:(步长步长步长))触发间隔CREATE TRIGGER <触发器名称> { BEFORE | AFTER }{ INSERT | UPDATE | DELETE } ON <表名称>FOR EACH ROW <-- <触发的SQL 语句>触发器的执行间隔:FOR EACH ROW 子句通知触发器每隔一行执行一次动作,而不是对整个表 执行一次。

Copyri ght 2005, MySQL AB Page 56. Syntax: Statement 语法语法::语句CREATE TRIGGER <触发器名称>{ BEFORE | AFTER }{ INSERT | UPDATE | DELETE }ON <表名称>FOR EACH ROW<触发的SQL语句> <--触发器包含所要触发的SQL语句:这里的语句可以是任何合法的语句,包括复合语句,但是这里的语句受的限制和函数的一样。

Privileges权限你必须拥有相当大的权限才能创建触发器(CREATE TRIGGER)。

如果你已经是Root用户,那么就足够了。

这跟SQL的标准有所不同,我也希望能尽快改成标准的。

因此在下一个版本的MySQL中,你完全有可能看到有一种叫做CREATE TRIGGER的新权限。

然后通过这样的方法赋予:GRANT CREATE TRIGGER ON <表名称> TO <用户或用户列表>;也可以通过这样收回权限:REVOKE CREATE TRIGGER ON <表名称> FROM <用户或用户列表>;Referring to OLD and NEW columns 关于旧的和新创建的列的标识在触发器的SQL语句中,你可以关联表中的任意列。

但你不能仅仅使用列的名称去标识,那会使系统混淆,因为那里可能会有列的新名(这可能正是你要修改的,你的动作可能正是要修改列名),还有列的旧名存在。

因此你必须用这样的语法来标识:"NEW . column_name" 或者"OLD . column_name". 这样在技术上处理(NEW | OLD . column_name)新和旧的列名属于创建了过渡变量("transition variables")。

相关文档
最新文档