日期:2014-05-17  浏览次数:20544 次

关于SQL-Server中触发器的问题。请高人指点下
问题1:
如果创建一个这样的触发器
CREATE TRIGGER reminder
ON titles
FOR INSERT, UPDATE
 
如果想在insert 和update 操作中 区别对待, 比如 insert 可以做一些事情,update做另外一种事情,想共用同一个触发器,请问能不能这样做?

问题2:
创建一个 
CREATE TRIGGER Tress
   ON  [dbo].[Address]
   AFTER UPDATE

如果给这张Address表更新,我想给Address表的子表也更新,怎么给子表也更新呢?数据如何传进来那?
比如我只是给 
Insert into dbo.Address values (10005,'NasnChafdsadsadsdfdasfafng2','Chinafdsfdsaf')
怎么给Address表的子表传进数据呢?

问题3:
在sqlserver2012中能否给特定的一张表的某个触发器打开递归,我想写个复杂些的递归触发器,大家能不能给点建议,我是做老师的作业,我这个老师是写的越复杂他给的分越高。

这次的作业是触发器。所以想搞个复杂点的触发器。

------解决方案--------------------
1、你那个逻辑可以用inserted,deleted两个触发器里面的表来实现,不过如果你想分开做操作好不如单独出来,也就两个触发器而已,方便管理和调试。
2、还是在inserted表做手脚。或者在
Insert into dbo.Address values (10005,'NasnChafdsadsadsdfdasfafng2','Chinafdsfdsaf')后面再:
insert into 子表 values(10005)后面的值你自己弄了
3、触发器越复杂开销越高,什么水平的老师,不教别人写些复杂的存储过程叫人写触发器。
------解决方案--------------------

--1.在一个Trigger中分别处理insert,update,delete
create trigger add_iud
on address for insert,update,delete
as
--1.1 insert
if exists(select 1 from inserted) and not exists(select 1 from deleted)
begin
...
end
--1.2 update
if exists(select 1 from inserted) and exists(select 1 from deleted)
begin
...
end
--1.3 delete
if not exists(select 1 from inserted) and exists(select 1 from deleted)
begin
...
end
--2.给子表插数据
create trigger add_子表
on address for insert
as
insert 子表(字段...)
select 字段... from inserted 
--3.同意楼上,触发器不需要太复杂.

------解决方案--------------------
问题1

create trigger reminder
on titles
for insert,update
as
begin
 if exists(select 1 from inserted) and not exists(select 1 from deleted)
 begin
   [insert对应的代码]
 end

 if exists(select 1 from inserted) and exists(select 1 from deleted)
 begin
   [update对应的代码]
 end
end


问题2

create trigger Tress
 on dbo.Address
 after UPDATE
as
begin
 [触发器代码]
 insert into [Address表的子表]([字段列表]) values([字段值列表]) 
end


问题3
据我了解,没有这个功能. 实际环境中不推荐使用触发器,弊大于利.