首先,我創建一個表,這個腳本:爲什麼如果我在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_demo
的INSTEAD 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
名字不會改變......
爲什麼????
有趣的是'INSTEAD OF UPDATE'觸發器包含引用*插入*記錄並執行'INSERT'動作的代碼。這是故意的嗎? – TLS
我認爲你需要'更新觸發器'後,而不是'而不是更新'。 –
我從Google.com上得到了..大聲笑,我想學習'而不是更新'觸發器..當我用這個腳本我搞不懂更新如果更新列不emp_sal ..我想要做的是,如果emp_sal被更新,那麼employee_demo的prev數據將被插入到employee_demo_audit表中。如果更新不是emp_sal,那麼它只是照常進行,更新表employee_demo的字段。 – XMozart