Archive
Posts Tagged ‘T-SQL’
Logging by Triggers in SQL Server
July 13, 2017
Leave a comment
We can alternatively use SQL Server feature CDC (Change Data Capture), but here I am providing one more way of doing it (custom solution).
Db Objects: (two tables and two triggers)
- TargetTableName: Table whose data we want to log
- LogTableName: Table where data will be logged. This table structure will be same as TargetTableName, and additionally this table will have three extra columns namely
- [log_action_type]
- [log_action_date]
- [log_action_user]
- [log_action_hostname]
- tl_TargetTableName: Trigger to log DML changes (Update and Delete only)
- tu_LogTableName: Trigger to avoid Delete or Update operations operations on logging table
use dbname
go
alter table LogTableName add [log_action_type] [char](1) not null;
alter table LogTableName add [log_action_date] [datetime] not null default getdate();
alter table LogTableName add [log_action_user] [varchar](50) null;
alter table LogTableName add [log_action_hostname] [varchar](50) default host_name();
go
IF OBJECT_ID ('dbo.tu_LogTableName ','TR') IS NOT NULL
DROP TRIGGER dbo.tu_LogTableName;
GO
-- =============================================
-- Author: Umesh Patil
-- Create date: 2014/08/26
-- Description: Restirct Delete or Update operations operations on logging table
-- =============================================
CREATE TRIGGER dbo.tu_LogTableName
ON dbo.LogTableName
FOR DELETE,UPDATE
AS
BEGIN
RAISERROR ('Can not perform Delete or Update operations on UserTableName table, either disable/delete the trigger',16,1);
ROLLBACK TRANSACTION;
RETURN;
END
GO
use dbname
go
IF OBJECT_ID ('dbo.tl_TargetTableName','TR') IS NOT NULL
DROP TRIGGER dbo.tl_TargetTableName;
GO
-- =============================================
-- Author: Umesh Patil
-- Create date: 2014/08/26
-- Description: Log DML changes (Update and Delete only)
-- =============================================
CREATE TRIGGER dbo.tl_TargetTableName
ON dbo.TargetTableName
FOR DELETE,UPDATE
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ActionType char(1)
IF EXISTS (SELECT 1 FROM deleted)
BEGIN
IF EXISTS(SELECT 1 FROM inserted)
SET @ActionType='U'
ELSE
SET @ActionType='D'
END
IF @ActionType='U' OR @ActionType='D'
INSERT INTO [dbo].[TargetTableName]
([PrimaryKey_Column]
--include all columns
,[log_action_type]
,[log_action_date]
,[log_action_user]
,[log_action_hostname])
select
[PrimaryKey_Column]
--include all columns
,@ActionType as [log_action_type]
,getdate() as [log_action_date]
,suser_sname() as [log_action_user]
,host_name() as [log_action_hostname]
from deleted
END
GO
