I have wrote in an older post ( http://msprogrammer.serviciipeweb.ro/2010/06/28/ef-automatic-history-of-table-and-t4-files-tt-files/ ) how to generate history code for tables . The easy solution was to create a tt file that track for the ObjectContext the SaveChanges for each table that has a “history” in name. the limitation is that , when you raise an sql command such as “update table ” you must load from database a lot of rows for this….
Now I want to show the same thing, but generating triggers in database for that ! I start also from edmx file and with a template stealed from http://forums.asp.net/p/1599616/4083198.aspx ( to have type of fields in the database ) and another stealed and modified from StackOverflow(to generate trigger for after insert , update, delete) I manage to have a solution to generate sql tables and trigger code.
When is that good ?At the beginning stages of a project when the table structure changes by adding a new parameter.
Sample code generated for table Notes(ID, TextNote, PersonID)
print 'Create table Notes_History ';
Create Table Notes_History(
ID_Notes_History BIGINT IDENTITY NOT NULL
,History_Action varchar(50)
,History_From varchar(100) default HOST_NAME()
,History_User varchar(50) default SYSTEM_USER
,History_Date varchar(50) default getdate()
,Id int NOT NULL
,Textnote nvarchar (255) NULL
,PersonId int NULL
)
print 'end Create table Notes_History ';
GO
print 'create trigger for Notes'
GO
CREATE TRIGGER dbo.TR_IUP_Notes
ON Notes
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Ins int
DECLARE @Del int
SELECT @Ins = Count(*) FROM inserted
SELECT @Del = Count(*) FROM deleted
if(@Ins + @Del = 0)
return;
declare @operation varchar(50)
set @operation ='update';
if(@ins < @del)
set @operation ='delete';
if(@ins > @del)
set @operation ='insert';
if(@ins <= @del)
begin
INSERT INTO Notes_History(History_Action ,Id,Textnote,PersonId)
select @operation ,Id,Textnote,PersonId from deleted
end
else
begin
INSERT INTO Notes_History(History_Action ,Id,Textnote,PersonId)
select @operation ,Id,Textnote,PersonId from inserted
end
END
The drawback of the code : the user that executes is not always the logged sql server user…
Anyway, what you have to do to use this automatically generated history/audit for tables ?
download historysql and modify
string inputFile = @”Model1.edmx”;
from historysql.tt to your edmx name. Then take the generated code and execute in sql server.