触发器

asdfa23rdadsdfa 2010-10-26 03:14:00
刚刚看了写资料。
触发器不能接收参数。
触发表的delete,insert,update操作.

那既然不能接收参数,那insert什么?delete什么,update什么

有的人说把数据放到其他表中存储,然后触发器去读取表里的数据执行操作。那岂不是麻烦了?

我是想把触发器写到存储过程里去。
本身存储过程可以接收参数。
那触发器就可以运用存储过程接收的参数了。
写了下,碰到问题都是些语法错误。
----------------
我想了解下。存储过程里能写触发器吗?
-----------------
如果要写个触发器接收参数,应该用什么变通的方式来写?
可能有的人会说,为什么不用存储过程。这里就不讨论了(我就是想触发器怎么实现)

...全文
192 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
asdfa23rdadsdfa 2010-10-26
  • 打赏
  • 举报
回复
OK.我知道了
select 1 from inserted
这样是得到最后一条插入的数据吧。
如果是的话,就这就够了。
dawugui 2010-10-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 dawugui 的回复:]
http://topic.csdn.net/u/20101025/21/7313b4a1-2803-4b95-9721-38b0cef2d25a.html

求一个MS SQL触发器方法

还可以参考此帖六楼的方法
[/Quote]错了,是四楼.

表A

ID(标识) NAME(名称) WEIGHT(重量)
1 Sylar 100
2 Sylar 200
3 Sylar 300
4 Back 900
5 Back 800


表B
ID(表B的标识) NAME(名称) R_NUM(记录条数) WEIGHT_SUM(总重量)
1 Sylar 3 600
2 Back 2 1700


A表主要2个字段,名字和重量。
B表相应的统计A表里NAME字段相同的记录有多少条(保存在R_NUM),以及他们的总重量是多少(保存在WEIGHT_SUM里)。

用触发器实现。
触发器,就是更新A表的时候,B表可以自动更新记录。
比如我更新了A表,添加了记录: 6 Sylar 100
则,B表的第一条记录自动更新为: 1 Sylar 4 700


create table a(ID int, NAME varchar(10), WEIGHT int)
create table b(ID int IDENTITY(1,1), NAME varchar(10),R_NUM int, WEIGHT_SUM int)
go

create trigger my_trig on a for insert , delete , update
as
begin
if exists(select 1 from inserted)
begin
if exists(select 1 from b where name = (select name from inserted))
begin
update b set R_NUM = (select count(1) from a where a.name = b.name) from b where b.name = (select name from inserted)
update b set WEIGHT_SUM = (select sum(a.WEIGHT) from a where a.name = b.name) from b where b.name = (select name from inserted)
end
else
insert into b (NAME , R_NUM ,WEIGHT_SUM) select a.name , count(1) , sum(a.WEIGHT) from a , inserted i where a.name = i.name group by a.name
end
else
begin
update b set R_NUM = (select count(1) from a where a.name = b.name) from b where b.name = (select name from deleted)
update b set WEIGHT_SUM = (select sum(a.WEIGHT) from a where a.name = b.name) from b where b.name = (select name from deleted)
end
end
go

insert into a values(1 ,'Sylar' ,100)
insert into a values(2 ,'Sylar' ,200)
insert into a values(3 ,'Sylar' ,300)
insert into a values(4 ,'Back' ,900)
insert into a values(5 ,'Back' ,800)

select * from b

drop table a,b

/*
ID NAME R_NUM WEIGHT_SUM
----------- ---------- ----------- -----------
1 Sylar 3 600
2 Back 2 1700

(所影响的行数为 2 行)
*/


dawugui 2010-10-26
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20101025/21/7313b4a1-2803-4b95-9721-38b0cef2d25a.html

求一个MS SQL触发器方法

还可以参考此帖六楼的方法
dawugui 2010-10-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhengfujie 的回复:]
引用 1 楼 guguda2008 的回复:
主要是你想干什么


我想a表插入一条数据的时候,计算出统计结果到其他表。a表执行insert的时候都要统计结果到其他表。
但有些数据从a表中存储到其他表。
[/Quote]参考如下内容:

--触发器的操作1

create table 化验室纱组(本厂编号 int,客户 int,色号 int,纱支 int)
create table 化验室布组(本厂编号 int,客户 int,色号 int,布类 int)
go
create trigger my_trig on 化验室纱组 for insert ,update ,delete
as
if not exists(select 1 from inserted)
delete 化验室布组 from deleted t where 化验室布组.本厂编号 = t.本厂编号
else if not exists(select 1 from deleted)
insert into 化验室布组(本厂编号 ,客户 ,色号) select 本厂编号 ,客户 ,色号 from inserted
else
update 化验室布组 set 客户 = t.客户 , 色号 = t.色号 from inserted t where 化验室布组.本厂编号 = t.本厂编号
go

--1、insert 对化验室纱组插入数据,然后查看化验室布组表的数据
insert into 化验室纱组 values(1 , 2 , 3 , 4)
insert into 化验室纱组 values(5 , 6 , 7 , 8)
go
select * from 化验室布组
/*
本厂编号 客户 色号 布类
----------- ----------- ----------- -----------
1 2 3 NULL
5 6 7 NULL

(所影响的行数为 2 行)
*/

--2、update , 更改化验室纱组表中本厂编号=1的色号=6
update 化验室纱组 set 色号 = 6 where 本厂编号 = 1
go
select * from 化验室布组
/*
本厂编号 客户 色号 布类
----------- ----------- ----------- -----------
1 2 6 NULL
5 6 7 NULL

(所影响的行数为 2 行)
*/

--3、delete 化验室纱组表中本厂编号=1的那条数据
delete from 化验室纱组 where 本厂编号 = 1
go
select * from 化验室布组
/*
本厂编号 客户 色号 布类
----------- ----------- ----------- -----------
5 6 7 NULL

(所影响的行数为 1 行)
*/

drop table 化验室纱组 , 化验室布组
asdfa23rdadsdfa 2010-10-26
  • 打赏
  • 举报
回复
当然用存储过程可以解决。

但我想了解了解看触发器应该怎么写
asdfa23rdadsdfa 2010-10-26
  • 打赏
  • 举报
回复
有没有例子提供看看
asdfa23rdadsdfa 2010-10-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 guguda2008 的回复:]
主要是你想干什么
[/Quote]

我想a表插入一条数据的时候,计算出统计结果到其他表。a表执行insert的时候都要统计结果到其他表。
但有些数据从a表中存储到其他表。
dawugui 2010-10-26
  • 打赏
  • 举报
回复
直接告诉你,触发器不接受参数.

如果你非要用触发器.

1.那就把数据放到其他表中存储,然后触发器去读取表里的数据执行操作。即使麻烦也得这么做.
2.那就把数据放到全程变量中存储,然后触发器去读取全程变量中的数据执行操作.
xuam 2010-10-26
  • 打赏
  • 举报
回复
..................
inserted , deleted ....
我觉得lz最好找本书看看 ,理解触发器的原理先!
SQLCenter 2010-10-26
  • 打赏
  • 举报
回复
存储过程里面不能写触发器

但触发器里面可以调用存储过程
guguda2008 2010-10-26
  • 打赏
  • 举报
回复
主要是你想干什么

34,590

社区成员

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

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