其实绝大部分的数据在一定时间内都很少有改变的,如果每个点都update一下,效率太低了,就想能不能通过触发器,在update之前,检查一下这个测点的数据,是否改变了,如果改变了,就继续update,如果没改变,则中止这个点数据的更新。
表结构如下:
监测点数据表(监测点ID,监测点名称,监测点值,变比)
希望触发器 在UPDATE 监测点数据之前,判断UPDATE的新值是否与旧值相同,如果没有变化,则中止这个测点的数据UPDATE,否则更新这个测点的数据。
请问各位高手,可不可以实现?
11 个解决方案
#1
create trigger ut_监测点数据表 on 监测点数据表
instead of update
as
if exists(select * from inserted i,deleted d where i.监测点ID=d.监测点ID and isnull(i.监测点值,0)<>isnull(d.监测点值,0))
begin
update 监测点数据表
set 监测点数据表.监测点值=i.监测点值
from 监测点数据表,inserted i,deleted d
where 监测点数据表.监测点ID=i.监测点ID and i.监测点ID=d.监测点ID and isnull(i.监测点值,0)<>isnull(d.监测点值,0)
end
instead of update
as
if exists(select * from inserted i,deleted d where i.监测点ID=d.监测点ID and isnull(i.监测点值,0)<>isnull(d.监测点值,0))
begin
update 监测点数据表
set 监测点数据表.监测点值=i.监测点值
from 监测点数据表,inserted i,deleted d
where 监测点数据表.监测点ID=i.监测点ID and i.监测点ID=d.监测点ID and isnull(i.监测点值,0)<>isnull(d.监测点值,0)
end
#2
学习
#3
UP
#4
学习学习!~~~
#5
其实只要有for update触发器就行,没有更新是不会触发的
#6
支持yesyesyes的说法,只要FOR update就可以了。
另外我觉得数据库结构能不能改一下:增加一个监测时间,记下每次修改的时间。这样只要针对有最新检测时间的记录进行处理,系统的运行效率比较高,而且写程序也简单。
另外我觉得数据库结构能不能改一下:增加一个监测时间,记下每次修改的时间。这样只要针对有最新检测时间的记录进行处理,系统的运行效率比较高,而且写程序也简单。
#7
其实只要有for update触发器就行,没有更新是不会触发的
-----------------------------------------------------
是这样的吗?看下面的测试
drop table tabletest
create table tabletest(id int)
insert into tabletest(id)
select 10
create trigger tu_tabletest on tabletest
for update
as
print '触发过'
update tabletest
set id = 10
where id = 10
--这条语句会打印出'触发过'
不知道分析得对不对,请见谅!
-----------------------------------------------------
是这样的吗?看下面的测试
drop table tabletest
create table tabletest(id int)
insert into tabletest(id)
select 10
create trigger tu_tabletest on tabletest
for update
as
print '触发过'
update tabletest
set id = 10
where id = 10
--这条语句会打印出'触发过'
不知道分析得对不对,请见谅!
#8
在Oracle中,触发器是有UPDATE之前,UPDATE之后,插入之前、插入之后这样的写法。但sql server我不太清楚。
至于触发器内部,是否有数据的自我判断功能,还真不清楚,这可能要了解得更深入才行,比喻触发器的工作机制。
我现在还没有测试,明天向大家报告效果。
至于触发器内部,是否有数据的自我判断功能,还真不清楚,这可能要了解得更深入才行,比喻触发器的工作机制。
我现在还没有测试,明天向大家报告效果。
#9
回 :ljs1519() ( ) 信誉:100 Blog
我只要保存实时的监测点的数据,方便集成在MIS中,让办公室人员查看实时的情况。不需要做趋势分析,所以没必要时间字段。
我只要保存实时的监测点的数据,方便集成在MIS中,让办公室人员查看实时的情况。不需要做趋势分析,所以没必要时间字段。
#10
update tabletest
set id = 10
where id = 10
=======
这就是更新啊
set id = 10
where id = 10
=======
这就是更新啊
#11
zltion:明白了,前面我的理解有问题。
#1
create trigger ut_监测点数据表 on 监测点数据表
instead of update
as
if exists(select * from inserted i,deleted d where i.监测点ID=d.监测点ID and isnull(i.监测点值,0)<>isnull(d.监测点值,0))
begin
update 监测点数据表
set 监测点数据表.监测点值=i.监测点值
from 监测点数据表,inserted i,deleted d
where 监测点数据表.监测点ID=i.监测点ID and i.监测点ID=d.监测点ID and isnull(i.监测点值,0)<>isnull(d.监测点值,0)
end
instead of update
as
if exists(select * from inserted i,deleted d where i.监测点ID=d.监测点ID and isnull(i.监测点值,0)<>isnull(d.监测点值,0))
begin
update 监测点数据表
set 监测点数据表.监测点值=i.监测点值
from 监测点数据表,inserted i,deleted d
where 监测点数据表.监测点ID=i.监测点ID and i.监测点ID=d.监测点ID and isnull(i.监测点值,0)<>isnull(d.监测点值,0)
end
#2
学习
#3
UP
#4
学习学习!~~~
#5
其实只要有for update触发器就行,没有更新是不会触发的
#6
支持yesyesyes的说法,只要FOR update就可以了。
另外我觉得数据库结构能不能改一下:增加一个监测时间,记下每次修改的时间。这样只要针对有最新检测时间的记录进行处理,系统的运行效率比较高,而且写程序也简单。
另外我觉得数据库结构能不能改一下:增加一个监测时间,记下每次修改的时间。这样只要针对有最新检测时间的记录进行处理,系统的运行效率比较高,而且写程序也简单。
#7
其实只要有for update触发器就行,没有更新是不会触发的
-----------------------------------------------------
是这样的吗?看下面的测试
drop table tabletest
create table tabletest(id int)
insert into tabletest(id)
select 10
create trigger tu_tabletest on tabletest
for update
as
print '触发过'
update tabletest
set id = 10
where id = 10
--这条语句会打印出'触发过'
不知道分析得对不对,请见谅!
-----------------------------------------------------
是这样的吗?看下面的测试
drop table tabletest
create table tabletest(id int)
insert into tabletest(id)
select 10
create trigger tu_tabletest on tabletest
for update
as
print '触发过'
update tabletest
set id = 10
where id = 10
--这条语句会打印出'触发过'
不知道分析得对不对,请见谅!
#8
在Oracle中,触发器是有UPDATE之前,UPDATE之后,插入之前、插入之后这样的写法。但sql server我不太清楚。
至于触发器内部,是否有数据的自我判断功能,还真不清楚,这可能要了解得更深入才行,比喻触发器的工作机制。
我现在还没有测试,明天向大家报告效果。
至于触发器内部,是否有数据的自我判断功能,还真不清楚,这可能要了解得更深入才行,比喻触发器的工作机制。
我现在还没有测试,明天向大家报告效果。
#9
回 :ljs1519() ( ) 信誉:100 Blog
我只要保存实时的监测点的数据,方便集成在MIS中,让办公室人员查看实时的情况。不需要做趋势分析,所以没必要时间字段。
我只要保存实时的监测点的数据,方便集成在MIS中,让办公室人员查看实时的情况。不需要做趋势分析,所以没必要时间字段。
#10
update tabletest
set id = 10
where id = 10
=======
这就是更新啊
set id = 10
where id = 10
=======
这就是更新啊
#11
zltion:明白了,前面我的理解有问题。