http://topic.csdn.net/t/20041028/09/3498141.html
有A、B两表。B表中记录取自A表
A:
ID(PK), Name, Sex, Job, Address, ….
B:
ID(PK), Name, Address
现想在A上建立触发器,当A中记录发生增加、某个字段(Address)发生更新、记录删除时,对B中的记录进行相应的增加、更新和删除的工作。请问邹建大哥及各位老大,是写成单个触发器还是写成三个触发器好呢?如果写成单个触发器,请问这个触发器怎么写? 我碰到的问题是不知如何在触发器中区分三个不同的操作。请大家帮忙。。。
--写成三个吧,免得在触发器中去判断属于那种操作
--新增同步
create trigger tr_insert_A on A
for insert
as
insert B(ID,Name,Address) select ID,Name,Address from inserted
go
--删除同步
create trigger tr_delete_A on A
for delete
as
delete B from deleted d where B.ID=d.ID
go
--更新同步
create trigger tr_update_A on A
for update
as
if update(Name) or update(Address)
update B set Name=i.Name,Address=i.Address
from B,inserted i,deleted d
where i.ID=d.ID and i.ID=b.ID
谢谢邹建大哥。再问一下,三个触发器与单个触发器相比,性能上会有所不如吗?
另外,如果是这样的两个表,我又应该怎样做呢?呵呵,主要A的关键字段变了
有A、B两表。B表中记录取自A表
A:
Name(PK), Sex, Job, Address, ….
B:
ID(PK), Name, Address
很少来SQL SERVER版 ,不过邹建大名可是如雷贯耳,看你们帖子真长知识呀!!!
请教写成一个触发器怎么写?
某个字段(Address)发生更新
create trigger tr_update_A on A
for update
as
if update(Address)
begin
update B set Name=i.Name,Address=i.Address
from B,inserted i,deleted d where i.ID=d.ID and i.ID=b.ID
end
go
删除
create trigger tr_delete_A on A
for delete
as
delete B from deleted d where B.ID=d.ID
go
俺不是老大,首先声明~
关键字变了无所谓的。
看你的id是自增字段,还是一定长度的编号了。
如是自增字段,你可以这样写:
--新增同步
create trigger tr_insert_A on A
for insert
as
insert B(Name,Address) select Name,Address from inserted
go
--删除同步
create trigger tr_delete_A on A
for delete
as
delete B from deleted d where B.name=d.name
go
--更新同步
create trigger tr_update_A on A
for update
as
if update(Address)
update B set Address=i.Address
from B,inserted i,deleted d
where i.name=d.name and i.name=b.name
如id字段是按某种规则生成的编号,基本一样,只要在增加时,生成编号就可以了。
--写成一个触发器要判断当前操作是什么类型,所以在效率上没有三个好
--写成一个触发器,顺便体现你最后的表的解决方法
create trigger tr_insert_update_delete_A on A
for insert,update,delete
as
if not exists(select * from deleted) --如果是新增
insert B(Name,Address) select Name,Address from inserted
else if not exists(select * from inserted) --如果是删除
delete B from deleted d where B.Name=d.Name
else if update(Name) or update(Address) --如果是更新
update B set Name=i.Name,Address=i.Address
from B,inserted i,deleted d
where i.Name=d.Name and i.Name=b.Name
邹建大哥写的触发器Insert和Delete都没有问题,但是在Update情况下会有如下问题:A表的关键字段Name更新时,B表的Name字段无法更新!!这个问题要怎么解决呢??
create trigger tr_insert_update_delete_A on A
for insert,update,delete
as
declare @r int
set @r=@@rowcount
if @r=0 return
if not exists(select * from deleted) --如果是新增
insert B(Name,Address) select Name,Address from inserted
else if not exists(select * from inserted) --如果是删除
delete B from deleted d where B.Name=d.Name
else if update(Name) and @r>1 --如果更新了Name,则不允许多行,否则不能实现同步
begin
raiserror('不允许同时更新多条记录的主键值,更新被取消!',1,16)
rollback tran
return
end
else if update(Name)
update B set Name=i.Name,Address=i.Address
from B,inserted i,deleted d
where B.Name=D.Name
else if update(Address)
update B set Name=i.Name,Address=i.Address
from B,inserted i,deleted d
where B.Name=D.Name and i.Name=d.Name
分享到:
相关推荐
SQL DML 语句 ( INSERT、 DELETE 或 UPDATE) AFTER 指定了触发器在处理完成后触发 BEFORE 指定了触发器在处理完成前触发 默认情况下,触发器每个表触发一次 FOR EACH ROW 选项指定触发器每行触发一次(即触发器为...
嵌套处理 ISNULL 空值字符串联接 K3中的应用 高手不要下了
便利性-同步部分表,表组和相关记录 :tangerine: 经过战斗测试 安装 pgsync是一个命令行工具。 要安装,请运行: gem install pgsync 这将为您提供pgsync命令。 如果安装失败,则可能需要安装。 建立 在您的项目...
7.2.5 单稳触发器的VHDL实现 241 7.2.6 控制及分频模块的VHDL实现 243 7.2.7 位同步形成及移相模块的VHDL实现 244 7.2.8 FPGA实现及仿真测试 246 7.3 积分型位同步的FPGA实现 248 7.3.1 积分型位同步的原理 248...
一般的触发装置往往只采集一相同步信号,然后经单片机处理送出带有一定导通角α的六路脉冲控制信号,这无疑对三相交流电有一定的误差。本设计同时采集三相的同步脉冲信号,避免了只检测一相而造成的延时。同时,系统...
一般的触发装置往往只采集一相同步信号,然后经单片机处理送出带有一定导通角α的六路脉冲控制信号,这无疑对三相交流电有一定的误差。本设计同时采集三相的同步脉冲信号,避免了只检测一相而造成的延时。同时,系统...
混合和匹配混合变形、变换、精灵、纹理、动画器触发器、C# 事件等,以创建无限视位和表情表达。表情组件可以在模块内和模块间复用,不会冲突。该套件包含三个产品模块,以简化 2D/3D 口型同步、眼睛/头部移动和表情...
混合和匹配混合变形、变换、精灵、纹理、动画器触发器、C# 事件等,以创建无限视位和表情表达。表情组件可以在模块内和模块间复用,不会冲突。该套件包含三个产品模块,以简化 2D/3D 口型同步、眼睛/头部移动和表情...
如果对跨时钟域带来的亚稳态、采样丢失、潜在逻辑错误等等一系列问题处理不当,将导致系统无法运行。本文总结出了几种同步策略来解决跨时钟域问题。 2 异步设计中的亚稳态 触发器是FPGA设计中常用的基本器件。...
如果对跨时钟域带来的亚稳态、采样丢失、潜在逻辑错误等等一系列问题处理不当,将导致系统无法运行。本文总结出了几种同步策略来解决跨时钟域问题。 2 异步设计中的亚稳态 触发器是FPGA设计中最常用的基本器件...
还提出了基于轨迹变更的增量捕获策略,采用触发器捕获操作日志,用净化方法合并操作日志得到净增量数据。实验结果表明,混合式数据同步机制能更好地维护移动计算环境中数据的一致性,缩短同步响应时间,减少同步数据...
同步时钟愈快,电路处理数据的时间间隔越短,电路在单位时间处理的数据量就愈大。我们先来看一看同步电路中数据传递的一个基本模型:如下图 Tco是触发器时钟到数据输出的延时;Tdelay是组合逻辑的延时;Tsetup是...
而原方案使用触发器获取数据变化。 3、yugong的applier部分(更新到目标库),同样使用jdbc,直接把转化后的数据更新入目标库;而原方案利用java source把变化数据发送给外部程序处理。 4、yugong引入了Translator,...
摘 要:本文提出了多时钟域逻辑设计中的一般问题,介绍了异步电路设计中同步化处理的重要作用,分析了触发器失效的原因和几种可行的解决亚稳态失效的方法。 引言 在数字电路设计中,大部分设计都是同步时序...
这个同步器就是两级d触发器,其时钟为时钟域2的时钟。这样做是怕时钟域1中的这个信号,可能不满足时钟域2中触发器的建立保持时间,而产生亚稳态,因为它们之间没有必然关系,是异步的。这样做只能防止亚稳态传播,但...
10.4.1 使用临时表来传递一个记录集给一个嵌套的存储过程 10.4.2 使用光标来传递一个记录集给一个嵌套的存储过程 10.5 如何处理一个存储过程的结果集 10.6 使用标识值 10.6.1 一个标准问题及解答 10.6.2 标识值与...
10.4.1 使用临时表来传递一个记录集给一个嵌套的存储过程 10.4.2 使用光标来传递一个记录集给一个嵌套的存储过程 10.5 如何处理一个存储过程的结果集 10.6 使用标识值 10.6.1 一个标准问题及解答 10.6.2 标识值与...
前者需要同步来实现,而后者根据不同的设计应用有不同的处理办法 题目是都用英文写的,我用汉字来表达 1, a为输入端,b为输出端,如果a连续输入为1101则b输出为1,否则为0 例如a:0001100110110100100110 b:...
8.2.2 同一个表使用两次(自联接) 189 8.2.3 使用Access的自动查阅功能 191 8.3 运用操作查询:力量的源泉 193 8.3.1 生成表查询(SELECT INTO) 193 8.3.2 追加查询 194 8.3.3 更新查询(UPDATE..SET) ...
8.2.2 同一个表使用两次(自联接) 189 8.2.3 使用Access的自动查阅功能 191 8.3 运用操作查询:力量的源泉 193 8.3.1 生成表查询(SELECT INTO) 193 8.3.2 追加查询 194 8.3.3 更新查询(UPDATE..SET) 195 ...