触发器的大问题,请各位高手支招:

whidon 2003-09-11 02:31:21
在MS SQL Server中 trigger的for类型不支持text、ntext、image字段,使用instead of就可以了,可是对当前表的操作也cancel了,于是我使用了
insert into table select * from inserted,整个trigger如下:
create trigger uptTest
on Test
instead of update
begin
....
delete from Test where id in (select id from deleted)
insert into Test select * from inserted
end
这样势必形成trigger的直接递规,于是我采用了如下方式:
create trigger uptTest
on Test
instead of update
begin
....
alter table Test disable trigger all
delete from Test where id in (select id from deleted)
insert into Test select * from inserted
alter table Test enable trigger all
end
可又引发新的问题,我用程序处理Test表时,只能一行一行的处理,没法处理多行.多行一起处理时,引发"表结构已更改,游标失效"的错误。
各位高手支支招,我急用!
...全文
23 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
w_rose 2003-09-11
  • 打赏
  • 举报
回复
譬如说“流水号”字段是一个表的主键,你又不想额外写代码去计算这个流水号,但是直接insert的时候不提供主键的值数据库会出错(在视图中对于无法导航的关联或者计算性字段也如此),此时使用instead of insert触发器先计算出真正的“流水号”值,然后再用完整的insert命令语句插入表,数据库就不会报错了。

基本上,instead of XXX内部就应该用XXX来对数据操作,这样的代码才最清楚明白。
w_rose 2003-09-11
  • 打赏
  • 举报
回复
为什么要把 instead of 触发器写成那个累赘样子呢? 再多的臃肿代码只能堆砌出假的“高手”!

instead of update 触发器内部就应该使用update。触发器内部是不会直接递归的,在update
触发器内部对同一个表进行update很安全,不回造成深层的递归。

举个例子:

use tempdb
if object_id('atest') is not null drop table atest
create table atest(k int primary key,afield text)
insert atest(k,afield) values (1,'ajksdkjfasdf ')
insert atest(k,afield) values (2,'-------asd fkl adaf---')
insert atest(k,afield) values (3,'8982734723498124')
select k,cast(afield as varchar(60)) from atest
go
create trigger test on atest instead of update as
update a set afield=b.afield from atest as a inner join inserted as b on a.k=b.k
go
update atest set afield='////////////////' where k%2=1
select k,cast(afield as varchar(60)) from atest
go
whidon 2003-09-11
  • 打赏
  • 举报
回复
to pengdali(大力 V3.0): 我的数据库-->属性-->选项-->递归触发器,本来就没有选上
lxf31 2003-09-11
  • 打赏
  • 举报
回复
强烈关注!!
pengdali 2003-09-11
  • 打赏
  • 举报
回复
右键你的数据库-->属性-->选项-->去掉“递归触发器”
sdhdy 2003-09-11
  • 打赏
  • 举报
回复
insert into table select * from inserted,整个trigger如下:
create trigger uptTest
on Test
instead of update
begin
....
delete from Test where id in (select id from deleted)
insert into Test select * from inserted
end
不会形成trigger的直接递归

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧