sql触发器

mysql触发器trigger

非 Y 不嫁゛ 提交于 2020-02-01 08:57:27
2018年8月15日,今天由于之前的失误(因为刚来公司不太懂业务导致的)使一个不应该赋值的字段给赋值了,神奇的是居然上生产了,后来就是一系列数据错误,为了及时抑制事态的严重,只能写触发器了,因为改代码已经不现实了,大致情况是这样的,有一张表里面一个订单号和一个订单状态,由于当时是excel导入的数据,excel并没有这两个字段,当时来的时间不长,看到这个表有个订单号,感觉一个是个重要的字段,就问了一组长,他说用UUID赋值就行,后来就赋值了,赋值以后会不断的调取华泰那边的接口,因为这个订单号是我们生成的,华泰并没有,然后就是各种错,后来组长说谁让你赋值的,你见过那个业务字段可以随机赋值的,心里一万个MMP,当时不是你说的吗,后来就洗个触发器止损吧!!! 原文地址转载:https://www.cnblogs.com/phpper/p/7587031.html 通过这问大神的指点才写出来 先上我写的触发器: DROP TRIGGER if EXISTS upd_che; CREATE TRIGGER upd_che BEFORE INSERT ON wl_ser_info FOR EACH ROW BEGIN IF ( NEW.SERVICE_ORDER_STATUS = '' OR NEW.SERVICE_ORDER_STATUS IS NULL ) THEN SET NEW

MySQL学习笔记15:触发器

戏子无情 提交于 2020-02-01 08:29:15
触发器是由事件来触发某个操作,这些事件包括INSERT语句,UPDATE语句和DELETE语句 创建触发器 创建只有一个执行语句的触发器 CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件 ON 表名 FOR EACH ROW 执行语句 其中,触发器名参数指要创建的触发器的名字 BEFORE和AFTER参数指定了触发执行的时间,在事件之前或是之后 FOR EACH ROW表示任何一条记录上的操作满足触发事件都会触发该触发器 mysql> CREATE TRIGGER trig1 AFTER INSERT -> ON work FOR EACH ROW -> INSERT INTO time VALUES(NOW()); Query OK, 0 rows affected (0.09 sec) 上面创建了一个名为trig1的触发器,一旦在work中有插入动作,就会自动往time表里插入当前时间 创建有多个执行语句的触发器 CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件 ON 表名 FOR EACH ROW BEGIN 执行语句列表 END 其中,BEGIN与END之间的执行语句列表参数表示需要执行的多个语句,不同语句用分号隔开 tips: 一般情况下,mysql默认是以 ; 作为结束执行语句,与触发器中需要的分行起冲突   

触发器

本小妞迷上赌 提交于 2020-02-01 08:26:32
触发器的作用是使某些语句在事件发生时自动执行,只支持 delete,insert,update语句。 1.查看触发器 show triggers; 2.创建触发器 需要给出4条信息:唯一的触发器名(建议),触发器关联的表,触发器响应的某些语句,触发器何时执行(前或后) create trigger 触发器名 时间(before或after) 操作(insert,delete,update) on 表名 for each row 触发器程序体(可以是一句SQL语句,或者用 BEGIN 和 END 包含的多条语句) 3.删除触发器 drop trigger 触发器名 注:触发器不能更新或覆盖,要修改的话只能删除然后重新创建 4.实使用触发器 ① insert 触发器 在insert触发器的代码内,可以引用一个名为new的虚拟表,访问被插入的行; 在before insert触发器中,new虚拟表中的值可以被更新(允许更改被插入的值); 对于auto_increment列,new虚拟表在insert执行之前包含0,在insert执行之后包含新的自动生成值。 例: create trigger neworder after insert on orders for each row select new.order_num; 分析: 创建一个名为neworder的触发器

MySQL(十二)游标和触发器

纵然是瞬间 提交于 2020-02-01 08:24:57
一、游标 定义: 存储在MySQL服务器上的数据库查询,是一种被select语句检索出来的结果集。 作用: 方便在检索出来的结果集中前进或后退一行或多行。 游标主要用于交互式应用;MySQL中的游标只能用于存储过程(和函数)。 1、创建游标 游标使用declare语句创建;declare命名游标,并定义响应的select语句,根据需要带where和其他子句;例如: create procedure processorders() begin declare ordernumbers CURSOR for select order_num from orders; end; 这个存储过程中,declare定义和命名了游标ordernumbers,存储过程处理完成后,游标消失(因为它局限于存储过程内)。 2、打开和关闭游标 游标使用open cursor语句来打开,例如: open ordernumbers; 在处理open语句时执行查询,存储检索出的数据以供浏览和滚动; 游标处理完成时,使用close语句关闭,例如: close ordernumbers; close释放游标使用的所有内部内存和资源,因此在每个游标不在需要时都应该关闭。 PS: 一个游标关闭后,如果没有重新打开,则不能使用;但如果该游标被声明过,则不需要再次声明,用open语句打开使用即可。 如果不明确游标是否关闭

mysql之触发器trigger

非 Y 不嫁゛ 提交于 2020-02-01 08:24:09
触发器(trigger):监视某种情况,并触发某种操作。 触发器创建语法四要素:1. 监视地点(table) 2. 监视事件(insert/update/delete) 3. 触发时间(after/before) 4. 触发事件(insert/update/delete) 语法: create trigger triggerName after/before insert/update/delete on 表名 for each row #这句话在mysql是固定的 begin sql语句; end; 注:各自颜色对应上面的四要素。 首先我们来创建两张表: #商品表 create table g (   id int primary key auto_increment,   name varchar(20),   num int ); #订单表 create table o (   oid int primary key auto_increment,   gid int, much int ); insert into g(name,num) values('商品1',10),('商品2',10),('商品3',10); 如果我们在没使用触发器之前:假设我们现在卖了3个商品1,我们需要做两件事 1.往订单表插入一条记录 insert into o(gid,much)

SQL Server Audit监控触发器状态

天涯浪子 提交于 2020-01-26 23:26:27
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 注意事项(Attention) 疑问(Questions) 参考文献(References) 二.背景(Contexts)   DML触发器一般会运用在业务系统的逻辑处理上,在你对数据库用户权限控制不当的时候,这些DML触发器很可能莫名的被禁用或者删除了,你作为数据库管理员你想做冤大头嘛?背黑锅嘛?如果不想,下面给出4种解决方案: 1. 使用DDL触发器对服务级别或者数据库级别进行监控,可以参考文档: SQL Server DDL触发器运用 ,效果如下图所示: (Figure1:触发器的日志) 2. 也可以使用数据库DDL事件通知,可以参考文档: SQL Server 事件通知(Event notifications) ,效果如上图所示; 3. 第三种方案就是变更数据捕获(CDC),可以参考文档: SQL Server 变更数据捕获(CDC)监控表数据 4. 第四种方案就是这篇文章要讲到的新特性:SQL Server Audit,可以使用DATABASE AUDIT SPECIFICATION来捕获这些事件。 三.实现代码(SQL Codes) (一) 创建服务器级别的审核,注意设置FILEPATH为对应的路径,显示设置审核状态

使用Oracle的问题--主键自增

牧云@^-^@ 提交于 2020-01-26 18:59:23
主键自增的方法 Oracle中数据表的主键在jsp中的使用一般是在sql语句中的主键位置使用序列让其自增或者使用触发器的特殊存储过程。 触发器 触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。 使用触发器 首先正对主键创建一个序列,然后创建触发器,然后在触发器中输入以下代码 CREATE OR REPLACE TRIGGER 创建的触发器名 BEFORE INSERT ON 表名 FOR EACH ROW WHEN ( new . 主键id is null ) begin select 创建的序列名 . nextval into :new . 主键id from dual ; end ; 在sql语句中只需正常输入各字段即可。 触发器优缺点 在一般的逻辑简单的系统中,多使用触发器可使性能提升,但是在偏大的系统,逻辑复杂的项目中不考虑用触发器的存储过程,因为复杂的逻辑会导致触发器的多层嵌套,代码聚合度降低,容易出现死锁情况,调试系统时,触发器的级联关系也会造成一定的烦乱。所以根据系统的实用性选用较好的方法可以事半功倍。 来源: CSDN 作者: 空气里血腥味道 链接: https:/

mysql触发器

◇◆丶佛笑我妖孽 提交于 2020-01-26 00:31:16
创建触发器使用CREATE TRIGGER语句 ,要查看数据库中有哪些触发器可以使用SHOW TRIGGERS命令。 CREATE TRIGGER语法格式: CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt 说明: ● trigger_name:触发器的名称,触发器在当前数据库中必须具有唯一的名称。如果要在某个特定数据库中创建,名称前面应该加上数据库的名称。 ● trigger_time:触发器触发的时刻,有两个选项:AFTER和BEFORE,以表示触发器是在激活它的语句之前或之后触发。如果想要在激活触发器的语句执行之后执行几个或更多的改变,通常使用AFTER选项;如果想要验证新数据是否满足使用的限制,则使用BEFORE选项。 ● trigger_event:触发事件,指明了激活触发程序的语句的类型。trigger_event可以是下述值之一: INSERT:将新行插入表时激活触发器。例如,通过INSERT、LOAD DATA和REPLACE语句。 UPDATE:更改某一行时激活触发器。例如,通过UPDATE语句。 DELETE:从表中删除某一行时激活触发器。例如,通过DELETE和REPLACE语句。 ● tbl_name:与触发器相关的表名

SQL Server 2005中使用DDL触发器监控数据库变化

。_饼干妹妹 提交于 2020-01-23 13:18:35
添加,删除或修改数据库的对象,一旦误操作,可能会导致大麻烦,需要一个数据库管理员或开发人员对相关可能受影响的实体进行代码的重写。   为了在数据库结构发生变动而出现问题时,能够跟踪问题,定位问题的根源,我们可以利用DDL触发器来记录类似“用户建立表”这种变化的操作,这样可以大大减轻跟踪和定位数据库模式的变化的繁琐程度。    1、DDL触发器介绍   DDL 触发器是一种特殊的触发器,它在响应数据定义语言 (DDL) 语句时触发。它们可以用于在数据库中执行管理任务,例如,审核以及规范数据库操作。   使用 DDL 触发器,可以达到以下几种目的:    要防止对数据库架构进行某些更改。   希望数据库中发生某种情况以响应数据库架构中的更改。   要记录数据库架构中的更改或事件。   与标准的DML触发器一样,DDL 触发器在响应事件时执行存储过程。 但与标准的DML触发器不同的是,它们并不在响应对表或视图的 UPDATE、INSERT 或 DELETE 语句时执行存储过程。 它们主要在响应数据定义语言 (DDL) 语句执行存储过程。 这些语句包括 CREATE、ALTER、DROP、GRANT、DENY、REVOKE 和 UPDATE STATISTICS 等语句。 执行 DDL 式操作的系统存储过程也可以激发 DDL 触发器。    2、如何使用DDL触发器   第一步

MySQL SQL优化

匆匆过客 提交于 2020-01-20 15:47:38
SQL优化大全 索引优化 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t where num=0 3.应尽量避免在 where 子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描。 4.应尽量避免在 where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num=10 or num=20可以这样查询:select id from t where num=10 union all select id from t where num=20 http://5.in 和 not in 也要慎用,否则会导致全表扫描,如:select id from t where num in(1,2,3) 对于连续的数值,能用 between 就不要用 in 了:select id from t where num between 1 and 3 6