2012-12-20 72 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

相關問題