Earlier today I posted a generic SQL solution on easily manage one-to-many data in your SQL database. However, if you're using SQL Server 2005 (or above) you can use the OUTPUT clause to add an resultset to your SQL that will contain an audit trail of what data was removed and what data was added.
In the example, we had a database schema that looked like this:
The User table holds the information on all your Users, the UserRole table holds all the roles of each User and the Role table contains a list of valid roles that a user can hold.
If we want to update all the roles for a specific User, I showed you could use the following 2-step SQL process to update all their roles without deleting or changing existing roles that are still valid:
delete from UserRole where UserId = 1 -- IF WE HAVE NO ROLES TO ASSIGN, DO NOT RUN ANY CODE BELOW THIS LINE -- this deletes only rows not in our new selection and RoleId not in (1,2,3) insert into UserRole ( UserId, RoleId ) select 1 as UserId , RoleId from Role where RoleId in (1,2,3) -- only grab roles not already inserted into the database and RoleId not in ( select RoleId from UserRole where UserId = 1 )
However, we can take this code one step further we can use the OUTPUT clause in SQL Server 2005+ to capture the changed data so we can return a resultset with our query that provides an audit trail of all the changes:
-- create a table to store results from the various SQL operations declare @results table (Type varchar(20), UserId int, SecurityLevelId int) delete from UserRole -- store the records deleted into the temp table output 'deleted' as Type, Deleted.UserId, Deleted.RoleId into @results where UserId = 1 -- IF WE HAVE NO ROLES TO ASSIGN, DO NOT RUN ANY CODE BELOW THIS LINE, EXCEPT FOR THE FINAL SQL STATEMENT -- this deletes only rows not in our new selection and RoleId not in (1,2,3) insert into UserRole ( UserId, RoleId ) -- store the records deleted into the temp table output 'inserted' as Type, Inserted.UserId, Inserted.RoleId into @results select 1 as UserId , RoleId from Role where RoleId in (1,2,3) -- only grab roles not already inserted into the database and RoleId not in ( select RoleId from UserRole where UserId = 1 ) -- output the audit trail of the delete & insert operations select * from @results
With the addition of the OUTPUT clause, our query will now return resultset with 3 columns:
Now you've got a great little SQL snippet that you can use that builds an audit trail that you can use to track that changes to your UserRole table! While this is a pretty simple example, you could use this basic syntax anytime you need to manage this type of data.
2 Comments
Comments for this entry have been disabled.