数据库触发器

~~语法~~

CREATE TRIGGER <触发器名称>  --触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.
{ BEFORE | AFTER }  --触发器有执行的时间设置:可以设置为事件发生前或后。
{ INSERT | UPDATE | DELETE }  --同样也能设定触发的事件:它们可以在执行insert、update或delete的过程中触发。
ON <表名称>  --触发器是属于某一个表的:当在这个表上执行插入、 更新或删除操作的时候就导致触发器的激活. 我们不能给同一张表的同一个事件安排两个触发器。
FOR EACH ROW  --触发器的执行间隔:FOR EACH ROW子句通知触发器 每隔一行执行一次动作,而不是对整个表执行一次。
<触发器SQL语句>  --触发器包含所要触发的SQL语句:这里的语句可以是任何合法的语句, 包括复合语句,但是这里的语句受的限制和函数的一样。

顾名思义,new是新插入的数据,old是原来的数据

insert只会有new,代表着要插入的新记录

delete只会有old,代表着要删除的记录

update由于执行的是先删除旧的记录,再插入新的记录,因此new和old都会有,且含义与上面的相同

根据ID做一个hash路由算法分配服务器

触发器更新本表

Can’t update table ‘tbl’ in stored function/trigger because it is already used by statement which invoked this stored function/trigger 错误,
如果你在触发器里面对刚刚插入的数据进行了insert/update, 则出现这个问题。因为会造成循环的调用.
应该使用set操作,而不是在触发器里使用update,比如

Drop trigger route ;//删除触发器

delimiter $(意思是告诉mysql语句的结尾换成以$结束)

delimiter $
create trigger route  
before insert on arcticle_link
for each row
BEGIN
      set NEW.server_id=(floor(rand()*100)+1);
END$

rand的范围0 <= rand() < 1.0

error---Updating of NEW row is not allowed in after trigger
对new赋值的时候只能在触发器before中只用,在after中是不能使用的,比如
在after的触发器中,new的赋值已经结束了,只能读取内容。 如果使用after不能使用new赋值,只能取值
new在before触发器中赋值,取值;在after触发器中取值

时间: 2024-10-31 08:16:38

数据库触发器的相关文章

sqlserver 存储过程-关于一个数据库触发器的问题

问题描述 关于一个数据库触发器的问题 请教一个数据库相关的问题 各位大神好,小弟现正使用sqlserver数据库,现有这么一个需求, 需要监视有关 表A 的插入,修改,删除 操作,并需要将新的整条数据形成类似 <tbrecord id="某一行的ID" columnAname="该行的列名为columnAname的值" columnBname="该行的列名为columnAname的 值">tbName(表的名称) 一个xml字符串保存

spring-hibernate 与数据库触发器的问题

问题描述 hibernate 与数据库触发器的问题 今天碰到个jpa(hibernate) 与数据库触发器共存的问题. 有两张表A 和B,在表A上写了个触发器,当对A表某列进行update操作的时候,触发更新B的某条记录,但是hibernate 报如下错误: "Batch update returned unexpected row count from update; actual row count: 2; expected: 1". hibernate执行update操作时,返回

link中如何调用数据库触发器?需要自己写语句么?

问题描述 link中如何调用数据库触发器?需要自己写语句么? link中如何调用数据库触发器?需要自己写语句么? 解决方案 http://bbs.csdn.net/topics/310207347

请问数据库触发器有什么用

问题描述 请问数据库触发器有什么用 请问,数据库 触发器有什么用,求各位大神前来相助,请说详细点哦.谢谢了 解决方案 在插入.修改等操作发生的时候,允许dba执行一段自定义的代码. 比如说,插入数据后添加一条日志.没有触发器,这样的逻辑,每次查询都要写一遍,就很麻烦,也不好维护. 有了触发器就简单了,只要写在一处就可以了. 解决方案二: 网上没有搜到你想要的答案吗?http://blog.csdn.net/chinayuan/article/details/6292335/ 解决方案三: 在插入

SQL Server数据库触发器安全隐患解析

  触发器权限和所有权 CREATE TRIGGER 权限默认授予定义触发器的表所有者.sysadmin 固定服务器角色成员以及 db_owner 和 db_ddladmin 固定数据库角色成员,并且不可转让. 需要的环境 本文需要的环境是已经获取了sql服务器的以上其中一个权限,目的是为了留下隐蔽的后门,不被管理员发现.即使发现了也是加密的(可以破解,不过有些管理员不懂,也不会注意,相关信息google下). 触发器是在对表进行插入(insert).更新(update)或删除(delete)操

MySQL数据库触发器添加,查询,删除操作

 在很多时候,干得利索不如想的明白.方案应该根据场景来设计,不是盲目的依靠经验,当然这也算新经验!    需求是把公司的几套公共系统做成通过邮箱用户名和密码认证,只需记住一对用户名密码,简单为上,只允许用户在ExtMail的web页面修改密码!在做论坛认证的时候,由于论坛的复杂性,想到了如下的几个方案: 通过OAuth2.0做认证,或者自己写接口,问题是只听过,没玩过! 在邮箱修改时,也提交到论坛的数据库.可惜不会ExtMail的Perl代码,且修改代码工作量太大! 先前已经把线上邮箱用户表同步

java调用数据库触发器

问题描述 数据库里面已经编辑好了触发器createtriggerinsert_borrowonborrowforinsertasifexists(selectreader_idfromloss_reportingwherereader_idin(selectreader_idfrominserted))beginprint('已挂失')rollbackendJDBC操作数据库时候,如果已经挂失的读者不可以再借书,会在控制台报出错误而停止程序但是我想在java中拿到触发器的错误提示信息"已挂失&q

帮忙啊帮忙啊 数据库-触发器?

问题描述 具体是这样的我有一个网站有注册会员功能单独数据库Access的后来朋友做了个论坛给我也是单独的数据库Access的这样一来我网站的用户在从网站进入论坛后原来注册的ID就不能使用了我现在已经把两个数据库合成一个单里面的表不同还是不能实现网站和论坛ID共享我应该如何做?2张用户表该怎么合在一起阿?我想能不能实现这样:当我其中一个注册时的ID自动追加到另一个里如果能实现就解决了有人和我说用触发器就告诉我3字能详细说说么? 解决方案 解决方案二:添加两关联表的关系,实现级链更新删除等,这样就成

数据库触发器(Trigger)的一点使用心得_数据库其它

(1) 针对较为复杂的跨多表的数据业务级别的约束,可以通过触发器来替代大量的后台判断代码,效率较高且便捷. (2) 如果想通过触发器辅助业务逻辑,不能单着眼于数据库内容的变化来设计触发器,还必须紧密结合业务模型中涉及该表的所有地方,因为很有可能因为不一致的逻辑处理方式导致我们设计的触发器遗漏下一些分支条件!其实,在这种情况下,如果能有更好的方法,不建议使用触发器,因为牵扯到过多的业务逻辑内容的话,会使触发器的设计和编写困难重重,不能充分发挥其便捷高效的优点. (3) 鉴于触发器在实际运行的时候,

数据库触发器控制

①选修成绩表SCTS中,学生选修成绩由平时成绩(regular_grade)和考试成绩(exam_grade)构成课程总评成绩(total_mark),公式为:total_mark= regular_grade*30%+ exam_grade*70% 设计DML触发器,使得当用户修改某位学生选修某门课程的平时成绩或者考试成绩时,自动实现对该学生该门课程总评成绩的更新. Create trigger Tri_UPDATE_SCTS on SCTS after UPDATE AS BEGIN IF