日期:2014-05-18  浏览次数:20556 次

|M| 关于触发器 在Inser 的时候可不可以根据一个字段是不是一个值而执行这条触发器
比如我有表
A
id     name   age     viald
1       AA       21       0
2       BB       24       1
触发器   trg_A_Insert
当插入的记录的viald=1时触发这条触发器

谢谢

------解决方案--------------------
create trgger trg_A_Insert on A
for insert
as
if exists(select 1 from inserted where viald=1)
begin
触发器代码
end
go
------解决方案--------------------
当然可以:
在执行触发器语句之前,加个判断.
但要注意一次插入多条语句时如何处理.
------解决方案--------------------
應該就是這麼寫

Create Trigger TR_Update
On A
For Insert
As
If Exists(Select 1 From Inserted Where viald = 1)
--執行代碼
GO


有viald = 1的數據就觸發
------解决方案--------------------
触发器只要有INSERT,UPDATE,DELETE操作就都会被触发的,对于AFTER触发器,可以判断:
当插入的记录的viald <> 1时使用ROLLBACK来使触发器失败:
create trigger trg_insert on table
for insert
as
if (exists(select 1 from inserted where viald <> 1))
rollback
else
...
GO

------解决方案--------------------
更正一下:
当插入的记录的viald <> 1时使用ROLLBACK来使触发器失败:
---------------------
应该为当插入的记录的viald <> 1时使用ROLLBACK来使【插入】失败:
也就是说INSERT不成功,viald <> 1的行没有插入到表中。
------解决方案--------------------
zyciis316() ( ) 信誉:100 Blog 加为好友 2007-07-04 11:18:05 得分: 0


Exists 这个东西是不是返回 true || false


-----------
對。

就是判斷是否存在viald為1的數據
------解决方案--------------------
Exists 这个东西是不是返回 true || false
------------------------------------------------
是的。
象paoluo下面这样写的触发器的结果是viald <> 1的行还是被插入到表中了,只是没有对该行进行任何处理而已。不知道楼主想要的是哪种:
Create Trigger TR_Update
On A
For Insert
As
If Exists(Select 1 From Inserted Where viald = 1)
--執行代碼
GO


有viald = 1的數據就觸發

------解决方案--------------------
我有个问题哈~
我以前面试时,给我面试的对我说,触发器有2种的,一种是事前,就是INSERT,UPDATE,DELETE前操作就都会被触发判断,说这种好少用到.
另一种就是以INSERT,UPDATE,DELETE,再触发器,如果发现错了,像这样的.
if exists(select 1 from inserted where viald=1)
begin
触发器代码
end

真有第一种嘛?方式如何?
------解决方案--------------------
create trgger trg_A_Insert on A
for insert
as

update ... --具体处理
from ..., --处理的相关表
inserted i
where .... --连接条件
and i.viald=1

go


--这样触发器只处理viald=1的插入,其他的不处理,一次插入多条,部分viald=1部分不是的也可以处理