使用触发器的工作原理 为什么两张表里的数据不一样,有一张表多了一条相同的

mysql的触发器同数据库多表的数据操作
的触发器同多表的数据操作
摘要: 为了不改原有代码,实现客户端和服务端数据同步,为每个需要同步数据的表加上触发器。 介绍一下这个是对同一数据库中不同表的操作。在一张表中操作时,需要对其他表进行修改操作。
一.触发器的基本语法:
1、命名规则
CREATE TRIGGER BEFORE&触发器名称& &{//触发器必须有名字,最多64个字符,可能后面会附有分隔符
//触发器触发时间是在事件之前触发还是之后触发(也可以在过程中触发)
INSERT | UPDATE | DELETE
//触发器三种事件
ON &表名称&FOR EACH ROW&触发器SQL语句& &//语句可以是任何合法的语句,包括复合语句,但是这里的语句受的限制和函数的一样
2、触发器的创建
不能给同一张表的同一个事件安排两个触发器,但是可以给同张表定义多个触发器(如:在同一张表对Insert事件定义一个触发器,对update再定义一个触发器)
3、基本的设置
给触发器设置权限:Gank create trigger on &表名& to 用户。
回收权限:Revoke create trigger on 表明 from 用户
删除触发器:drop TRIGGER 触发器名
MyISAM:不支持事务,用于只读程序提高性能 &
InnoDB:支持ACID事务、行级锁、并发 &
Berkeley DB:支持事务&
二:触发器语句
背景:在不修改原工程的情况去做安卓端和服务端的同步操作。为已经存在的项目里面的数据库建张表ict_table_version,然后在需要同步的表上加上一个字段version。(同步方案看文档)。
在需要同步的表上创建触发器。当表进行事物操作时,此表上的rowversion字段取最大值+1,同时ict_table_version表里面的version+1。语句:
CREATE TRIGGER ilt_tak_trigger before update //after出错不知为何
ON ilt_tak
FOR each row
SET new.rowversion = (select max(rowversion)+1 from ict_tak) ;//new是获取前期记录标识。对于Insert语句,只有new是合法的,对于deleted语句,只有old是合法的。对于update语句两者都可以使用。
UPDATE ict_table_version
SET version = version+1 WHERE table_name='ict_tak';//对其它表操作
注意在操作两条语句间没有用&and&而是用&;&。
在End前面加上exception &when...then...异常处理语句 &End 对异常进行处理。同样,在End前面还可以加上事物回滚。&oracle 触发器,在向一张表插入数据同时,把插入的数据放到另一张表中。下面的写法对不对?_百度知道
oracle 触发器,在向一张表插入数据同时,把插入的数据放到另一张表中。下面的写法对不对?
CREATEORREPLACETRIGGERSMS_WORKFLOWAFTERINSERTONWORKFLOW_FILEINBOXBEGININSERTINTOSMSENDTASK(flowid,useid)SELECTflow_id,user_idFROMinsertedEND...
CREATE OR REPLACE TRIGGER SMS_WORKFLOW AFTER INSERT ON WORKFLOW_FILEINBOXBEGIN INSERT INTO SMSENDTASK (flowid,useid)SELECT flow_id, user_id FROM inserted END
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
wang2213053
wang2213053
获赞数:20
不对,正确写法如下:CREATE OR REPLACE TRIGGER SMS_WORKFLOW AFTER INSERT ON WORKFLOW_FILEINBOXBEGIN INSERT INTO SMSENDTASK (flowid,useid)SELECT flow_id, user_id FROMEND SMS_WORKFLOW ;
采纳数:72
获赞数:328
你测试一下呗。感觉好像是这样的
shukongchengbd
shukongchengbd
采纳数:11
获赞数:25
测试!!!
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。昨天,头给布置了一任务,主要是写一个触发器 ,用来在某表中的一个字段更新后,将同表中的另一个字段也进行修改.
我昨天那个纠结啊!!好半天,主要是之前没有玩过触发器,找了些资料后,大概能看懂了网上的那些资料.不过,我真觉得有太多的资料都是在那里胡扯,都是ctrl+c 和ctrl+v来的,有意思吗?!
废话不多说了,首先,我要实现的这个操作是对同一个表的操作,当然了,当一个字段改变时需要改变另一个字段的这个操作必须是在update之前就要完成的,要是在update之后完成的话,就会出现死锁现象.
具体的触发器创建代码如下:
create or replace trigger RUDI_TRIGGER
before update of inde_value on rundata_up_daily_inde
for each row
-- local variables here
:old.id =:new.id
:new.is_update:=1;
end RUDI_TRIGGER;
Oracle 使用触发器监控用户操作表
最近,客户反映有一个表的记录被人修改了,想查归档日志,又比较麻烦,于是用一个触发器帮他解决了这个问题。1、创建接收删除用户的表信息SQL& create table tab_mon_midify as...
触发器记录对表记录操作
这里记录满足一定条件的操作,并将操作记录下来。
创建记录日志表
create table emp_trace_log(
empno number, -- 主键
column_name ...
监控SQL:用触发器来监控是哪些语句、存储过程修改了特定表(4)
实际问题如下:
有一个表A,表A中有一个字段B被某个存储过程修改了。
比如B的初始值为1,被某个存储过程改为了0,但是现在存储过程大概有1000多个,有没有什么好的方法,可以监测到这个字段是被谁修...
简单利用触发器监控表记录的更改
---显示授权给所有用户查询这两个视图
grant select on sys.v_$
grant select on sys.v_$sqlarea to publ...
oracle 对表的语句监控
oracle 9i/10g关于执行sql语句的监控 16:00有的时候由于某种原因,我们需要监控对某个表的操作,例如:某个字段总是被莫名其妙的修改,此时就需要监控执行该操作的sql...
线上oracle数据库有张表的数据有些乱,根据应用db的log和应用的log也没有检查出来谁修改了,所以决定把这张单表做个详细的insert、update、delete监控。一:使用数据...
oracle 9i/10g关于执行sql语句的监控
有的时候由于某种原因,我们需要监控对某个表的操作,例如:某个字段总是被莫名其妙的修改,此时就需要监控执行该操作的sql语句和操作人等信息,...
1. 首先我们建立一个简单的表,我们将为这张表添加FGA审计策略。create table
xx.test(a varchar2(100),b varchar2(100),c varchar2(10...
oracle的trigger:在这里我是以例子的形式演示。
创建两张表:
create table client(
cid number,
name varchar2(35),
如何对表操作进行监控
我们在跟踪定位一些系统问题的时候,经常需要知道哪些地方对一个表进行了操作,查询代码很麻烦,其实有一个简单的方法,就是跟踪表,如下语句,就可以给表t_table增加监控了。
没有更多推荐了,博客分类:
编写触发器实现两张表数据同步,sql代码如下:
create or replace trigger buid_mend_manager
after insert or update or delete
on TMP_EIC_MEND
referencing old as old_value
new as new_value
for each row
if inserting then
insert into Eic_mend(mendid, mendname)
values(:new_value.mendid, :new_value.mendname);
elsif updating then
update Eic_mend set mendname = :new_value.mendname
where mendid = :new_value.
elsif deleting then
delete from Eic_mend where mendid = :old_value.
论坛回复 /
(0 / 5436)
gaogengzhi
浏览: 90595 次
来自: 广州
菜鸟求教。为什么要用map呢??&pre name=&q ...
mark 作为资料参考
牛X 输入whereis oracle下面输出的mysql的路 ...
谢谢楼主啊,我找了好久啊
能在说下如何在在触发器中调用存储过程 ...
Oracle在ubuntu上安装就是麻烦,不知道oracle公 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'你真的了解触发器么 数据实时同步更新问题剖析
&更新时间:日 12:19:02 & 作者:
触发器就是我们想要的神器了。我们可以在那张动态表上新建触发器。触发器的实质就是个存储过程,只不过他调用的时间是根据所建的动态表发生该表而执行(即:Insert新数据,Update或者Delete数据)具体怎么使用触发器,今天我这里就不介绍了
当我们想更新一张动态表的时候(即:表中的数据不断的添加),也许我们会用数据库代理,通过写作业,然后让他定时查询动态表中最新添加的数据,然后更新数据。这样时能实现更新数据的要求,但是数据却不能实时同步更新。 这个时候,触发器就是我们想要的神器了。我们可以在那张动态表上新建触发器。触发器的实质就是个存储过程,只不过他调用的时间是根据所建的动态表发生该表而执行(即:Insert新数据,Update或者Delete数据)。 具体怎么使用触发器,今天我这里就不介绍了,园子里资料多的很。那么我今天要介绍的是什么呢? 前几天在写sql代码的时候无意间发现了这么个问题:就是我一直以为每当动态表中插入一条数据,触发器就执行一次,但是我这样理解的话,当批量插入数据的时候,触发器执行的次数和插入的行数相同,但是事实不是这样。乘着今天有点时间,就想写出来和大家分享下,讲的不对请大家斧正! 下面,我就写了个简单的例子供大家参考。
代码如下: --我们要建触发器的动态表 Create table Table_a ( ID int identity(1,1),--自增ID Content nvarchar(50), UpdateIDForTrigger int )
然后我们在该表上创建一个触发器
代码如下: Create TRIGGER [dbo].[Table_a_Ins] ON [dbo].[Table_a] AFTER INSERT AS BEGIN declare @ID int set @ID=(select ID from inserted) --更新Table_a表中的UpdateIDForTrigger字段的值,为了能更明显的看出实时执行的效果 UPDATE Table_a SET UpdateIDForTrigger = (@ID+10)--为了能看出不同,就直接将比ID大10的值作为变量赋值 WHERE ID = @ID; END
接下来,我们按照普通一条条的插入结果测试下:
代码如下: --给信息表添加数据 insert into Table_a(Content) values('信息一'); insert into Table_a(Content) values('信息二');
然后查询下现在动态表中的数据情况
代码如下: select * from Table_a
查询结果如图: &我们可以看到触发器执行了。在每条数据插入的时候触发器同时执行了Update功能。 然后,我们要批量插入数据,为了方便我们插入,我们这里建立一张临时的基本信息表:
代码如下: --基本信息表 Create table Table_Info ( ID int identity(1,1), Content nvarchar(50) )
然后插入数据
代码如下: insert into Table_Info(Content) values('信息三'); insert into Table_Info(Content) values('信息四'); insert into Table_Info(Content) values('信息五'); insert into Table_Info(Content) values('信息六'); insert into Table_Info(Content) values('信息七'); insert into Table_Info(Content) values('信息八'); insert into Table_Info(Content) values('信息九'); insert into Table_Info(Content) values('信息十');
然后我们就可以批量插入数据到动态表中了
代码如下: insert into Table_a(Content) select Content from Table_Info
这次重点来了,我们在执行这个sql语句的时候消息框中会出现错误提示: &有经验的朋友会知道,这个错误是由于多个结果用“=”赋值给一个变量导致的。 即:set @变量=(select 多行结果 from Table) 这个时候,我就疑惑了,问题出在哪里了呢?不是触发器在每插一条数据的时候执行一次么? 于是,我将触发器改了下:
代码如下: Alter TRIGGER [dbo].[Table_a_Ins] ON [dbo].[Table_a] AFTER INSERT AS BEGIN select ID END
然后再执行上面的批量插入试试看,看看他inserted表中到底存的是什么值: 果然不出所料,inserted表中的结果并不是一条数据: 知道错误的原因,我们操作起来就简单了,我们可以给inserted表建游标,然后通过游标来对批量插入的每行数据进行编辑。下面是我们修改后的触发器代码:
代码如下: Alter TRIGGER [dbo].[Table_a_Ins] ON [dbo].[Table_a] AFTER INSERT AS BEGIN declare @ID int declare cur_Insert cursor for select ID from inserted open cur_Insert fetch next from cur_Insert into @ID while @@fetch_status=0 begin UPDATE Table_a SET UpdateIDForTrigger = (@ID+10)--为了能看出不同,就直接将比ID大10的值作为变量赋值 WHERE ID = @ID; fetch next from cur_Insert into @ID end close cur_Insert deallocate cur_Insert END
然后,我们再按照上面的批量插入数据,然后查询下动态表中的结果:
代码如下: insert into Table_a(Content) select Content from Table_I select * from Table_a;
此时运行没有错误提示了,运行结果如下:
&这样,批量插入插入数据时触发器也能用了。 然后结合了几位前辈的建议,再改了下触发器的代码。将上面的游标改成了下面的方式:
代码如下: Alter TRIGGER [dbo].[Table_a_Ins] ON [dbo].[Table_a] AFTER INSERT AS BEGIN UPDATE Table_a SET UpdateIDForTrigger =inserted.ID+10 FROM inserted Where Table_a.ID=inserted.ID END
然后再批量插入了几行数据,结果也是可以的。所以学无止境啊!! &总结下:触发器运行是每次执行一次Insert操作或者是Update,Delete等操作的时候才执行的。它的对象不是针对于修改的行数(即:每行修改的时候执行)。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具}

我要回帖

更多关于 数据表中的触发器怎么打开 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信