2012-12-20 68 views
0

首先,我创建一个表,这个脚本:为什么如果我在SQL Server 2005中创建触发器而不是更新,我的表不更新?

CREATE TABLE [dbo].[Employee_Demo] (
    [Emp_ID] [bigint] IDENTITY (1, 1) NOT NULL , 
[Emp_Name] [varchar] (55) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , 
[Emp_Sal] [decimal](10, 2) NULL 
    ) ON [PRIMARY] 

,然后我创建另一个表

CREATE TABLE [dbo].[Employee_Demo_Audit] (
[Emp_ID] [int] NULL , 
[Emp_Name] [varchar] (55) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , 
[Emp_Sal] [decimal](10, 2) NULL , 
[Audit_Action] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL , 
[Audit_Timestamp] [datetime] NULL 
) ON [PRIMARY] 

后,我创建表employee_demoINSTEAD OF UPDATE触发:

CREATE TRIGGER trgInsteadOfUpdate ON dbo.Employee_Demo 
INSTEAD OF Update 
AS 
declare @emp_id int, @emp_name varchar(55), @emp_sal decimal(10,2), @audit_action varchar(100); 
select @emp_id=i.Emp_ID from inserted i; 
select @emp_name=i.Emp_Name from inserted i; 
select @emp_sal=i.Emp_Sal from inserted i; 
IF UPDATE (Emp_sal) 
begin 
BEGIN 
BEGIN TRAN 
    if(@emp_sal>=1000) 
    begin 
    RAISERROR('Cannot Insert where salary fewer then 1000',16,1); ROLLBACK; end 
    else begin 
    insert into Employee_Demo_Audit(Emp_ID,Emp_Name,Emp_Sal,Audit_Action,Audit_Timestamp) values(@emp_id,@emp_name,@emp_sal,@audit_action,getdate()); 
    COMMIT; 
    PRINT 'Record Updated -- Instead Of Update Trigger.'; END; end 
end 

我不知道为什么我用这个脚本更新表employee_demo

UPDATE employee_demo 
SET emp_name = 'ZHEE' 
WHERE emp_id = 1 

emp_id = 1名字不会改变......

为什么????

+0

有趣的是'INSTEAD OF UPDATE'触发器包含引用*插入*记录并执行'INSERT'动作的代码。这是故意的吗? – TLS

+0

我认为你需要'更新触发器'后,而不是'而不是更新'。 –

+0

我从Google.com上得到了..大声笑,我想学习'而不是更新'触发器..当我用这个脚本我搞不懂更新如果更新列不emp_sal ..我想要做的是,如果emp_sal被更新,那么employee_demo的prev数据将被插入到employee_demo_audit表中。如果更新不是emp_sal,那么它只是照常进行,更新表employee_demo的字段。 – XMozart

回答

0

instead of触发器替代的默认行为。只有在Emp_sal列正在更改时,您的触发器才会执行更新。如果该列未更新,则不执行更新语句。

+0

所以如果我不更新emp_sal更新语句**不会执行任何更新语句**。 有什么办法可以避免它? 是我的触发器是以错误的方式??。 或者它是'而不是'触发器的规则??。 – XMozart

+0

我相信你必须提供默认行为,如果你有某些情况下,当你想要它发生。你完全用触发器取代了默认动作 - 它不会“落空”并执行它。 – TLS

+0

你可以给我一些例子,而不是更新触发器..我是使用t-sql的新手,这件事让我发疯.. @@ – XMozart

0

这可能与您在源表中使用bigint作为id并且在审计表中使用常规int的事实有关吗?

+0

我不这么认为..因为我有我的触发条件,它如果要更新的列是emp_sal,将会触发,所以如果我更新列emp_name它不应该触发该触发器,并且我的表应该更新,但它不会。 – XMozart

+0

这就是问题所在。触发器* always *触发,并且你的动作取代了'UPDATE'。 – TLS

相关问题