2014-11-21 69 views
0

以下是我的SQL Server 2008觸發存儲錯誤信息

ALTER TRIGGER [dbo].[Trigger_UpdateLeadMasters] ON [dbo].[LeadMasters] 
FOR UPDATE 
AS 

DECLARE @CompanyName nvarchar(50); 
DECLARE @PersonName nvarchar(50); 
DECLARE @Designation nvarchar(50); 
DECLARE @Number nvarchar(50); 
DECLARE @Number2 nvarchar(50); 
DECLARE @Emailaddress nvarchar(50); 
DECLARE @Address nvarchar(MAX); 
DECLARE @Address2 nvarchar(MAX); 
DECLARE @CityName nvarchar(50); 
DECLARE @State nvarchar(50); 
DECLARE @PinNumber nvarchar(50); 
DECLARE @Product nvarchar(50); 
DECLARE @RemarkNote nvarchar(MAX); 
DECLARE @Audit_Action varchar(100); 


select @CompanyName=i.CompanyName from inserted i; 
select @PersonName=i.PersonName from inserted i;   
select @Designation=i.Designation from inserted i; 
select @Number=i.Number from inserted i;   
select @Number2=i.Number2 from inserted i;  
select @EmailAddress=i.EmailAddress from inserted i;   
select @Address=i.Address from inserted i;  
select @Address2=i.Address2 from inserted i;  
select @CityName=i.CityName from inserted i;   
select @State=i.State from inserted i;  
select @PinNumber=i.PinNumber from inserted i; 
select @Product=i.Product from inserted i;  
select @RemarkNote=i.RemarkNote from inserted i; 

IF UPDATE(CompanyName) 
set @Audit_Action=' Name Modified or Updated' 
IF UPDATE(PersonName) 
set @Audit_Action='Person Name Modified or Updated' 
IF UPDATE(Designation) 
set @Audit_Action='Designation Modified or Updated' 
IF UPDATE(Number) 
set @Audit_Action='1st Phone Number Modified or Updated' 
IF UPDATE(Number2) 
set @Audit_Action='2nd Phone Number Modified or Updated' 
IF UPDATE(EmailAddress) 
set @Audit_Action='Email Address Modified or Updated' 
IF UPDATE(Address) 
set @Audit_Action='Address Modified or Updated' 
IF UPDATE(Address2) 
set @Audit_Action='Alternate Address Modified or Updated' 
IF UPDATE(CityName) 
set @Audit_Action='City Name Modified or Updated' 
IF UPDATE(State) 
set @Audit_Action='State Modified or Updated' 
IF UPDATE(PinNumber) 
set @Audit_Action='PinNumber Modified or Updated' 
IF UPDATE(Product) 
set @Audit_Action='Product Field Modified or Updated' 
IF UPDATE(RemarkNote) 
set @Audit_Action='Remark Note Modified or Updated' 

insert into LoggerLeadMasters(CompanyName,PersonName,Designation,Number,Number2,EmailAddress,Address,Address2,CityName,State,PinNumber,Product,RemarkNote,Audit_Action,Audit_Timestamp) 
Values(@CompanyName,@PersonName,@Designation,@Number,@Number2,@EmailAddress,@Address,@Address2,@CityName,@State,@PinNumber,@Product,@RemarkNote,@Audit_Action,GETDATE()) 

上觸發但問題是,每當我修改LeadMasters表任何領域,觸發轉到行

IF UPDATE(RemarkNote) 
set @Audit_Action='Remark Note Modified or Updated' 

並存儲錯誤信息LoggerLeadMasters.Can任何人可以幫助我解決這個問題

謝謝

+2

你的觸發器有** MAJOR **缺陷,你似乎認爲它會被稱爲**每行**一次 - 這是**不是**的情況。觸發器將在每個語句**中觸發一次**,所以如果你的UPDATE語句影響了25行,你將觸發**觸發**一次,但是,然後「插入」和「刪除」將分別包含25行。您的代碼在這25行中選擇哪一個?從插入的i中選擇@ CompanyName = i.CompanyName;' - 它是非確定性的 - 將挑選一個,所有其他人將被忽略。你需要重寫你的觸發器來考慮這個問題! – 2014-11-21 12:15:13

+0

感謝@marc_s你可以建議更改我的代碼嗎? – user2614235 2014-11-21 12:23:51

+1

除了marc_s提到的set操作的問題之外,如果多於一個字段被更新,例如預期的Audit_Action是什麼,城市名稱和地址和...? – bummi 2014-11-21 12:53:41

回答

3

基本上,您需要重新設計觸發器,以便能夠在Inserted(和Deleted)僞表格中處理多行 - 即使UPDATE語句影響10,20,50行,觸發器也只會被調用一次。

所以基本上,你的代碼需要看起來像這樣:

ALTER TRIGGER [dbo].[Trigger_UpdateLeadMasters] 
ON [dbo].[LeadMasters] 
FOR UPDATE 
AS 
    INSERT INTO dbo.LoggerLeadMasters(CompanyName, PersonName, Designation, Number, Number2, 
             EmailAddress, Address, Address2, CityName, State, 
             PinNumber, Product, RemarkNote, 
             Audit_Action, Audit_Timestamp) 
     SELECT 
      CompanyName, PersonName, Designation, Number, Number2, 
      EmailAddress, Address, Address2, CityName, State, 
      PinNumber, Product, RemarkNote, 
      '?????', GETDATE() 
     FROM 
      Inserted 

現在最大的挑戰將是拿出那個Audit_Action,因爲你現在可能插入幾行,每行的可能有更新的不同列...

通常,你不能只將它轉換爲一個單一的字符串 - 通常會做的是存儲舊的和新的感興趣的列 - 因此你總是有信息以後可以更新的內容。

另外:SQL服務器和更新有很多已經內置了這個功能 - 這就是所謂的變化數據捕捉,這可能會救你不必寫幾十個觸發器 - 瞧瞧吧!

+0

marc_c感謝您的回覆。我已經嘗試過CDC,但我無法弄清楚修改後的列值存儲在哪裏。主要目的是跟蹤修改並在DataGridView上顯示它。 – user2614235 2014-11-22 03:52:11