注册 登录
编程论坛 SQL Server论坛

[求助]比触发器更具有挑战性的问题

ninggang 发布于 2006-12-27 11:21, 947 次点击
我在开发一个图书馆管理系统,遇到了一个问题:当我修改某一个表中的指定字段时才触发相应的事件(但是当修改其他字段的时候,却不触发这个事件)这个问题,该怎么处理啊,呵呵
<1>通过触发器可以吗,如果行该怎么处理
触发器建立的一般代码如下:CREATE TRIGGER [TRIGGER NAME] ON [dbo].[BS1]
FOR INSERT, UPDATE, DELETE /*(触发的条件*/
AS
Begin
/*所要触发的事件的代码*/
End
<2>如果不行,可以用其他的方法实现吗?比如说什么事件,任务调度?呵呵
10 回复
#2
angeloc2006-12-27 11:28
对表建触发器,在触发器里可以对指定列是否更改做判断,如果更改就执行你的操作,指定列如果没更改就直接跳出程序块.
#3
ninggang2006-12-27 11:30
哈哈,谢谢,可以具体一点吗?
#4
ninggang2006-12-27 11:31

写点代码吧,万分感谢,呵呵

#5
lengxie2006-12-27 13:30
可以使用IF UPDATE语句定义一个监视指定列的数据更新的触发器。这样,就可以让触发器容易的隔离出特定列的活动。当它检测到指定列已经更新时,触发器就会进一步执行适当的动作,例如发出错误信息指出该列不能更新,或者根据新的更新的列值执行一系列的动作语句。
语法
IF UPDATE (<column_name>)
例1
本例阻止用户修改Employees表中的EmployeeID列。
USE Northwind
GO
CREATE TRIGGER Employee_Update
ON Employees
FOR UPDATE
AS
IF UPDATE (EmployeeID)
BEGIN
RAISERROR ('Transaction cannot be processed.\
***** Employee ID number cannot be modified.', 10, 1)
ROLLBACK TRANSACTION
END
#6
ninggang2006-12-27 13:32
呵呵,谢谢!又学到新东西了,呵呵
#7
棉花糖ONE2006-12-27 16:50
以前还不知道有这功能,谢了
#8
李彬2006-12-28 12:55

照楼上所说的使用列级触发器就可以了!

#9
ninggang2006-12-28 16:12
USE Northwind
GO
CREATE TRIGGER Employee_Update
ON Employees
FOR UPDATE
AS
IF UPDATE (EmployeeID)
BEGIN
RAISERROR ('Transaction cannot be processed.\
***** Employee ID number cannot be modified.', 10, 1)
ROLLBACK TRANSACTION
END
上面的这段代码有个If UpDate (EmployeeID),这个就是对某个字段进行判断,可否理解为列级触发器,如果没有这一段,就是对整张表而言了吧,理解是否正确,呵呵
#10
LouisXIV2006-12-30 07:44
要注意的是,不仅仅是更新特定字段,当发生插入操作的时候也会被视为满足触发条件
#11
ninggang2006-12-30 09:43
好,回去验证严整
1