触发器??

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
...全文
208 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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张表?
? 第八章 触发器 ? ? 1、触发器(1) ? 2、触发器(2) ? 3、触发器(3) ? 4、触发器(4) ? 5、触发器(5) ? 6、触发器(6) ? 7、触发器(7) ? 8、触发器(8) ? 9、触发器(9) ? 10、触发器(10) ? 11、触发器(11) ? 12、触发器(12) ? 13、触发器(13) ? 14、触发器(14) ? 15、触发器(15) ? 16、触发器(16) ? 17、触发器(17) ? 18、触发器(18) ? 19、触发器(19) ? 20、触发器(20) ? 21、触发器(21) ? 22、触发器(22) ? ? ? ? 第九章 数据库的安全与备份 ? ? 1、数据库的安全与备份(1) ? 2、数据库的安全与备份(2) ? 3、数据库的安全与备份(3) ? 4、数据库的安全与备份(4) ? 5、数据库的安全与备份(5) ? 6、数据库的安全与备份(6) ? 7、数据库的安全与备份(7) ? 8、数据库的安全与备份(8) ? 9、数据库的安全与备份(9) ? 10、数据库的安全与备份(10) ? 11、数据库的安全与备份(11) ? 12、数据库的安全与备份(12) ? 13、数据库的安全与备份(13) ? 14、数据库的安全与备份(14) ? 15、数据库的安全与备份(15) ? 16、数据库的安全与备份(16) ? 17、数据库的安全与备份(17) ? 18、数据库的安全与备份(18) ? 19、数据库的安全与备份(19) ? 20、数据库的安全与备份(20) ? 21、数据库的安全与备份(21) ? 22、数据库的安全与备份(22) ? 23、数据库的安全与备份(23) ? 24、数据库的安全与备份(24) ? 25、数据库的安全与备份(25) ? 26、数据库的安全与备份(26) ? 27、数据库的安全与备份(27) ? 28、数据库的安全与备份(28) ? 29、数据库的安全与备份(29) ? 30、数据库的安全与备份(30) ? 31、数据库的安全与备份(31) ? 32、数据库的安全与备份(32) ? ? ? 第十章 报表 ? ? 1、 报表(1) ? 2、 报表(2) ? 3、 报表(3) ? 4、 报表(4) ? 5、报表(5) ? 6、报表(6) ? 7、报表(7) ? 8、报表(8) ? 9、报表(9)

34,838

社区成员

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

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