Вести журнал, используя триггер для обновления - PullRequest
0 голосов
/ 11 ноября 2019

Я создал следующую базу данных, таблицы и триггер для обновления, чтобы вести журнал обновлений. Когда пользователь изменяет имя / зарплату / пол / отправление, он обновляет журнал в таблице 'tblEmployeeAudit'.

Теперь есть ловушка, если мы просто обновляем то же значение, которое уже обновлено в системе, тогдане обновляется запись об обновлении в таблице 'tblEmployeeAudit'.

Например: - если tblEmployee имеет имя EmployeeName Ravi с Id = 1, то если обновление с таким же именем, тогда журнал обновляться не будет, но в этом нетпроисходит. Пожалуйста, помогите мне.

Create database learning
use learning

USE [learning]
GO

/****** Object:  Table [dbo].[tblEmployee]    Script Date: 11/11/2019 3:54:13 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[tblEmployee](
    [Id] [int] NOT NULL,
    [Name] [nvarchar](30) NULL,
    [Salary] [int] NULL,
    [Gender] [nvarchar](10) NULL,
    [DepartmentId] [int] NULL,
PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO


USE [learning]
GO

/****** Object:  Table [dbo].[tblEmployeeAudit]    Script Date: 11/11/2019 3:54:34 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[tblEmployeeAudit](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [AuditData] [nvarchar](1000) NULL,
PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

Alter trigger tr_tblEmployee_ForUpdate
on tblEmployee
For Update
As
Begin
    Declare @Id int
    Declare @OldName nvarchar(30),@NewName nvarchar(30)
    Declare @OldSalary int,@NewSalary int
    Declare @OldGender nvarchar(10),@NewGender nvarchar(10)
    Declare @OldDeptId int,@NewDeptId int

    Declare @AuditString nvarchar(1000)

    Select * into #TempTable
    from inserted

    While(Exists(Select Id from #TempTable))
    Begin
        Set @AuditString=''

        Select Top 1 @Id=Id,@NewName=Name,@NewSalary=Salary,@NewGender=Gender,@NewDeptId=DepartmentId from #TempTable

        Select @OldName=Name,@OldSalary=Salary,@OldGender=Gender,@OldDeptId=DepartmentId from deleted where Id=@Id

        Set @AuditString='Employee with Id='+CAST(@Id as nvarchar(4))+' changed '
        if(@OldName<>@NewName)
            Set @AuditString=@AuditString+'NAME from '+@OldName+' to '+@NewName

        if(@OldSalary<>@NewSalary)
            Set @AuditString=@AuditString+'Salary from '+@OldSalary+' to '+@NewSalary

        if(@OldGender<>@NewGender)
            Set @AuditString=@AuditString+'Gender from '+@OldGender+' to '+@NewGender

        if(@OldDeptId<>@NewDeptId)
            Set @AuditString=@AuditString+'DepartmentId from '+@OldDeptId+' to '+@NewDeptId

        insert into tblEmployeeAudit values(@AuditString)
        Delete from #TempTable where Id=@Id

    End

End



   update tblEmployee
    set Name='Joseph' where Id=4

Примечание: - Следите за данными, вставленными даже в том случае, если нет несовпадающих строк - обновленный сотрудник с Id = 4 изменен

Ответы [ 2 ]

0 голосов
/ 14 ноября 2019

Я бы посоветовал вам сначала проверить, изменилось ли что-нибудь, прежде чем приступить к генерации AuditString. Вы можете использовать оператор EXCEPT для проверки изменений.

IF EXISTS ( SELECT Id, Name, Salary, Gender from inserted 
            EXCEPT
            SELECT Id, Name, Salary, Gender from deleted)
BEGIN
-- GO FOR AUDIT LOGIC
END

Подробнее на КРОМЕ

0 голосов
/ 14 ноября 2019

Вместо того, чтобы создавать переменные для хранения измененных значений, используйте вставленные и удаленные таблицы, чтобы проверить, изменились ли значения, я думаю, что это решит вашу проблему

выберите * из вставленного я выбираю * из удаленногоd

Рядом * вы можете выбрать только имена столбцов, для которых вы хотите проверить значение.

...