Trigger- SQL SERVER
Estou fazendo uma trilha de auditoria em um banco pelo SQL SERVER. Utilizando a opção After Update consigo saber qual o valor que foi alterado usando a tabela ficticia deleted da transaction. Porém preciso colocar de um modo mais genérico, preciso buscar o nome do campo na tabela e o seu valor de modo que a trigger possa funcionar para quaisquer tabelas do banco.
Alguém sabe uma maneira de fazer isto?
Alguém sabe uma maneira de fazer isto?
Chromusmaster
Curtidas 0
Melhor post
Chromusmaster
13/03/2020
Para quem precisar, consegui fazer da seguinte maneira:
CREATE TABLE [dbo].[History](
[id] [uniqueidentifier] NOT NULL,
[Table] [nvarchar](max) NOT NULL,
[Field] [nvarchar](max) NOT NULL,
[Value] [nvarchar](max) NOT NULL,
[AlterDate] [datetime2](7) NOT NULL,
[AlterAuthor] [uniqueidentifier] NOT NULL,
[FieldId] [uniqueidentifier] NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
CREATE OR ALTER TRIGGER [dbo].[TriggerHistory]
ON [dbo].[Configuration]
AFTER UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @Old_record Nvarchar(Max),
@New_record Nvarchar(Max),
@Field NVARCHAR(MAX),
@ModifiedId Uniqueidentifier,
@User Uniqueidentifier;
IF ( UPDATE (id))
RAISERROR (50009, 16, 10);
IF( UPDATE ([name]))
BEGIN
-- Insert statements for trigger here
SELECT @Old_record = Name from DELETED;
SELECT @New_record = Name from INSERTED;
SELECT @ModifiedId=id from deleted;
SELECT @User=AuthorId from inserted;
IF @Old_record != @New_record
BEGIN
INSERT INTO [dbo].[History](iD,[Table],[Field],[Value],[AlterDate],[AlterAuthor],[FieldId])
SELECT NEWID(),'Configuration','Name',@Old_record,GETDATE(),@User,@ModifiedId FROM deleted;
END
END
IF ( UPDATE ([value]))
BEGIN
-- Insert statements for trigger here
SELECT @Old_record = Value from DELETED;
SELECT @New_record = Value from INSERTED;
SELECT @ModifiedId=id from deleted;
SELECT @User=AuthorId from inserted;
IF @Old_record != @New_record
BEGIN
INSERT INTO [dbo].[History](iD,[Table],[Field],[Value],[AlterDate],[AlterAuthor],[FieldId])
SELECT NEWID(),'Configuration','Value',@Old_record,GETDATE(),@User,@ModifiedId FROM deleted;
END
END
IF ( UPDATE ([system]))
BEGIN
-- Insert statements for trigger here
SELECT @Old_record = System from DELETED;
SELECT @New_record = System from INSERTED;
SELECT @ModifiedId=id from deleted;
SELECT @User=AuthorId from inserted;
IF @Old_record != @New_record
BEGIN
INSERT INTO [dbo].[History](iD,[Table],[Field],[Value],[AlterDate],[AlterAuthor],[FieldId])
SELECT NEWID(),'Configuration','system',@Old_record,GETDATE(),@User,@ModifiedId FROM deleted;
END
END
IF ( UPDATE ([deactivated]))
BEGIN
-- Insert statements for trigger here
SELECT @Old_record = Deactivated from DELETED;
SELECT @New_record = Deactivated from INSERTED;
SELECT @ModifiedId=id from deleted;
SELECT @User=AuthorId from inserted;
IF @Old_record != @New_record
BEGIN
INSERT INTO [dbo].[History](iD,[Table],[Field],[Value],[AlterDate],[AlterAuthor],[FieldId])
SELECT NEWID(),'Configuration','deactivated',@Old_record,GETDATE(),@User,@ModifiedId FROM deleted;
END
END
IF ( UPDATE ([AuthorId]))
BEGIN
-- Insert statements for trigger here
SELECT @Old_record = AuthorId from DELETED;
SELECT @New_record = AuthorId from INSERTED;
SELECT @ModifiedId=id from deleted;
SELECT @User=AuthorId from inserted;
IF @Old_record != @New_record
BEGIN
INSERT INTO [dbo].[History](iD,[Table],[Field],[Value],[AlterDate],[AlterAuthor],[FieldId])
SELECT NEWID(),'Configuration','AuthorId',@Old_record,GETDATE(),@User,@ModifiedId FROM deleted;
END
END
IF ( UPDATE ([Category]))
BEGIN
-- Insert statements for trigger here
SELECT @Old_record = Category from DELETED;
SELECT @New_record = Category from INSERTED;
SELECT @ModifiedId=id from deleted;
SELECT @User=AuthorId from inserted;
IF @Old_record != @New_record
BEGIN
INSERT INTO [dbo].[History](iD,[Table],[Field],[Value],[AlterDate],[AlterAuthor],[FieldId])
SELECT NEWID(),'Configuration','Category',@Old_record,GETDATE(),@User,@ModifiedId FROM deleted;
END
END
END
GOSTEI 1