2010-07-05 22 views
28

अपडेट किए गए मानों को मुझे SQL Server 2008 में ट्रिगर बनाने की आवश्यकता है जो एक पंक्ति से सभी मानों को सम्मिलित करता है जिसमें लॉग मान में कुछ मान बदल दिया गया था!ट्रिगर पुराने मूल्यों को सम्मिलित करें-

उदाहरण के लिए यदि मेरे पास टेबल कर्मचारी है, जिसमें कॉलम आईडी, नाम, पासवर्ड है, और मैं इस तालिका को अद्यतन करता हूं और कॉलम नाम के लिए नया मान डालता हूं, मुझे तालिका में मौजूद मानों को सम्मिलित करने की आवश्यकता है, तालिका में अद्यतन के बाद कर्मचारी लॉग इन करें।

मैं यह कैसे कर सकता हूं? धन्यवाद!

+1

अपने प्रश्न बहुत स्पष्ट नहीं है, आप इसे अलग तरीके से व्यक्त कर सकते हैं और संभवतः इसे विस्तार। यदि आप इसका उदाहरण दे सकते हैं कि आप क्या चाहते हैं तो इससे मदद मिलेगी। –

+0

उदाहरण के लिए मेरे पास आईडी 3 की तरह मान है; नाम जॉन; पासवर्ड जॉन; अब मैं तालिका कर्मचारियों को अद्यतन करता हूं और मार्क को मार्क करने के लिए नाम बदलता हूं, इससे पहले कि मैं इसे अद्यतन करता हूं मुझे लॉग टेबल मान 3, जॉन, जॉन में डालने की आवश्यकता है। – user383875

उत्तर

30

यहाँ में सब कुछ की दुकान एक उदाहरण अद्यतन ट्रिगर है:

create table Employees (id int identity, Name varchar(50), Password varchar(50)) 
create table Log (id int identity, EmployeeId int, LogDate datetime, 
    OldName varchar(50)) 
go 
create trigger Employees_Trigger_Update on Employees 
after update 
as 
insert into Log (EmployeeId, LogDate, OldName) 
select id, getdate(), name 
from deleted 
go 
insert into Employees (Name, Password) values ('Zaphoid', '6') 
insert into Employees (Name, Password) values ('Beeblebox', '7') 
update Employees set Name = 'Ford' where id = 1 
select * from Log 

यह प्रिंट होगा:

id EmployeeId LogDate     OldName 
1 1   2010-07-05 20:11:54.127 Zaphoid 
72

आपके ट्रिगर में, आपके पास दो छद्म-टेबल उपलब्ध हैं, Inserted और Deleted, जिनमें वे मान हैं।

अद्यतन के मामले में, Deleted तालिका में पुराने मान होंगे, जबकि Inserted तालिका में नए मान हैं।

इसलिए यदि आप अपने ट्रिगर में ID, OldValue, NewValue प्रवेश करना चाहते हैं, तो आप की तरह कुछ लिखने के लिए आवश्यकता होगी:

CREATE TRIGGER trgEmployeeUpdate 
ON dbo.Employees AFTER UPDATE 
AS 
    INSERT INTO dbo.LogTable(ID, OldValue, NewValue) 
     SELECT i.ID, d.Name, i.Name 
     FROM Inserted i 
     INNER JOIN Deleted d ON i.ID = d.ID 

मूल रूप से, आप Inserted और Deleted छद्म तालिकाओं में शामिल होने, आईडी हड़पने (जो एक ही है, मैं दोनों ही मामलों में अनुमान), Deleted मेज से पुराने मूल्य, Inserted मेज से नया मान, और आप LogTable

1

एसक्यूएल सर्वर 2008 में आप इस के लिए बदलें डाटा कैप्चर उपयोग कर सकते हैं। कैसे एक मेज पर इसे सेट अप करने का विवरण यहाँ हैं http://msdn.microsoft.com/en-us/library/cc627369.aspx

0
createTRIGGER [dbo].[Table] ON [dbo].[table] 
FOR UPDATE 
AS 
    declare @empid int; 
    declare @empname varchar(100); 
    declare @empsal decimal(10,2); 
    declare @audit_action varchar(100); 
    declare @old_v varchar(100) 

    select @empid=i.Col_Name1 from inserted i; 
    select @empname=i.Col_Name2 from inserted i; 
    select @empsal=i.Col_Name2 from inserted i; 
    select @old_v=d.Col_Name from deleted d 

    if update(Col_Name1) 
     set @audit_action='Updated Record -- After Update Trigger.'; 
    if update(Col_Name2) 
     set @audit_action='Updated Record -- After Update Trigger.'; 

    insert into Employee_Test_Audit1(Col_name1,Col_name2,Col_name3,Col_name4,Col_name5,Col_name6(Old_values)) 
    values(@empid,@empname,@empsal,@audit_action,getdate(),@old_v); 

    PRINT '----AFTER UPDATE Trigger fired-----.' 
संबंधित मुद्दे