触发器??

Crystal1981 2005-08-21 10:46:18
我想写一触发器,有Ware(WID,WName......)表,dept(ID,DeptName,ISSTOCK......)表,
其中在DEPT表中只要ISSTOCK='是',数据库中则有一个和Ware结构一样且表名为字段DeptName的值的数库表,字段DeptName的值的表中有Ware表中的一部分或全部记录,当修改Ware表时,字段DeptName的值的多个表中的记录也相应修改。
我在大家的帮助下写下如下的trigger,我明白不对请大家指教:
CREATE trigger upd_ware on Ware
for update
as
declare @DName nvarchar(12)
if exists(select @DName = DeptName from dept where ISSTOCK='是')
--这里为什么提示@DName 还没有声明呢?DeptName会有好多,是不是要用一个FOR一一循环?
begin
if exists(select * from @DName join inserted i on .WID=@DName.WID)
begin
update @DName
set WName=i.WName,
Wprice=i.WPrice,
........
from @DName join inserted i on i.WID=@DName.WID
end
end
...全文
195 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
filebat 2005-08-22
  • 打赏
  • 举报
回复
如果vivianfdlpw的方法也不行的话, 楼主可以试一下下面的方法(可能有点BT)

在数据库中定义一张与Ware表结构相同的表。

然后再将update触发时的inserted表插入到该表中。

再对上面程序进行相应修改。

这样做就不会出现“inserted对象名无效"的问题了, 而且是肯定可以达到效果的。

不知道还有没有其它好的办法。
filebat 2005-08-22
  • 打赏
  • 举报
回复
恩.
对的.
如果将inserted放在exec中,那的确是会出现"对象名inserted 无效".

看看vivianfdlpw的方法应该也存在同样的问题。

再想想。
Crystal1981 2005-08-22
  • 打赏
  • 举报
回复
To:filebat(Mark) 对数据作修改操作时出现“对象名inserted 无效”
To:vivianfdlpw() 你的我还要看看
vivianfdlpw 2005-08-22
  • 打赏
  • 举报
回复
局部临时表在exec中使用:
create procedure p
as
create table #(ID int)
insert # select 1 union select 2
declare @sql nvarchar(200)
set @sql=N'select * from #'
exec sp_executesql @sql
drop table #
go

--测试
exec p

--结果
/*
ID
-----------
1.00
2.00

(所影响的行数为 2 行)
*/
bugchen888 2005-08-22
  • 打赏
  • 举报
回复
因为table名称不定,所以楼主的需求只能通过动态SQL实现,而在动态SQL中是不认识inserted这些系统table的,而且在动态SQL外创建的局部临时table在动态SQL中也会被认为是无效对象。

能解决这个问题的方法只能是全局临时table(table名字前以“##”开头)。

vivianfdlpw() 的思路是正确的,只需要将“#”改为“##”就可以了。


Crystal1981 2005-08-22
  • 打赏
  • 举报
回复
TO:filebat(Mark),vivianfdlpw(),bugchen888(臭虫)
vivianfdlpw()的没问题。
vivianfdlpw 2005-08-21
  • 打赏
  • 举报
回复
CREATE trigger upd_ware on Ware
for update
as
begin tran
declare @DName nvarchar(12)
if exists(select DeptName from dept where ISSTOCK='是')
begin
select * into # from inserted
declare @sql nvarchar(4000)
declare cur cursor for select DeptName from dept where ISSTOCK='是'
open cur
fetch next from cur into @DName
while @@fetch_status=0
begin
set @sql=N' if exists(select * from '+@DName+' join # i on .WID='+@DName+'.WID)'+
N' begin'+
N' update '+@DName+
N' set WName=i.WName,'+
N' Wprice=i.WPrice,'+
N' ........'+
N' from '+@DName+' join # i on i.WID='+@DName'+.WID'+
N' end'
exec(@sql)
fetch next from cur into @DName
end
close cur
deallocate cur
drop table #
end

if @@error=0
begin
commit tran
end
else
begin
rollback tran
raiserror('更新数据失败',12,1)
end
go


filebat 2005-08-21
  • 打赏
  • 举报
回复
CREATE trigger upd_ware
on Ware
for update
as
declare @str varchar(8000), @set varchar(100)
select @set='set WName=i.WName,Wprice=i.WPrice '--此处修改成相应的值
set @str=''
select @str=@str+' update ['+deptname+'] '
+@set+' from ['+deptname+'] '
+' join inserted i on '
+'i.WID=['+deptname+'].WID'
+';'
from dept where ISSTOCK='是'
exec(@str)
go

Crystal1981 2005-08-21
  • 打赏
  • 举报
回复
不会,10个左右
filebat 2005-08-21
  • 打赏
  • 举报
回复
dept(ID,DeptName,ISSTOCK......)中记录的表多吗?
会不会超过100张表?

34,594

社区成员

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

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