在触发器中查找多个更新的列

Atul Thakre

我需要在一个表中标识多个列更新,并将它们存储在Audit表中。
这是审核架构:

 auditid   auditTimestamps updateFieldName  oldFieldValue  newFieldValue

我们还有另一个具有架构的表员工:

  EmpID  EmpName  Age  Address1  Phone

我在员工架构上编写了更新触发器,当记录更新时,触发器被触发,在触发器上,我检查哪个字段值已更新并在审计表架构上维护此信息。

 For checking field for update , i have used below code sample:

    BEGIN 
           if update(empName)
           begin 
              set @updatedcolumnname='empName';
              set @newvendorname=(SELECT empNameFROM inserted);
              set @oldvendorname=(SELECT empNameFROM deleted);
              //Here insert logic that insert above find values into audit table.
            end

              // Same check for all remaining fields( Age,Address1,Phone) 
   END

但这似乎对我不起作用。它将所有已更新但未更新的列插入审核表。

请提出如何在功能上实现上述建议。

谢谢

梅迪·洛菲

您可以在触发器中使用merge命令而不是insert命令。您还可以通过以下查询来计算更改的列:

SELECT 'empName' AS FieldName, d.empName AS OldValue, i.empName AS NewValue
FROM Inserted i
INNER JOIN deleted d ON d.EmpID = i.EmpID  
WHERE i.EmpName<>d.ImpName

UNION ALL

SELECT 'Age', d.Age, i.Age
FROM Inserted i
INNER JOIN deleted d ON d.EmpID = i.EmpID
WHERE i.Age<>d.Age

UNION ALL

SELECT 'Address1', d.Address1, i.Address1
FROM Inserted i
INNER JOIN deleted d ON d.EmpID = i.EmpID
WHERE i.Address1<>d.Address1

UNION ALL

SELECT 'Phone', d.Phone, i.Phone
FROM Inserted i
INNER JOIN deleted d ON d.EmpID = i.EmpID
WHERE i.Phone<>d.Phone

所以你的查询:

MERGE AuditTable AS Destination
USING (
        SELECT 'empName' AS FieldName, d.empName AS OldValue, i.empName AS NewValue
        FROM Inserted i
        INNER JOIN deleted d ON d.EmpID = i.EmpID
        WHERE i.EmpName<>d.ImpName

        UNION ALL

        SELECT 'Age', d.Age, i.Age
        FROM Inserted i
        INNER JOIN deleted d ON d.EmpID = i.EmpID
        WHERE i.Age<>d.Age

        UNION ALL

        SELECT 'Address1', d.Address1, i.Address1
        FROM Inserted i
        INNER JOIN deleted d ON d.EmpID = i.EmpID
        WHERE i.Address1<>d.Address1

        UNION ALL

        SELECT 'Phone', d.Phone, i.Phone
        FROM Inserted i
        INNER JOIN deleted d ON d.EmpID = i.EmpID
        WHERE i.Phone<>d.Phone

    ) AS SOURCE ON SOURCE.FieldName = Destination.UpdateFieldName 
                AND SOURCE.OldValue = Destination.OldFieldValue
                AND SOURCE.NewValue = Destinatino.NewFieldValue
    WHEN MATCHED THEN UPDATE SET OldFieldValue  = OldValue,
                                NewFieldValue = NewValue
    WHEN NOT MATCHED THEN INSERT (UpdateFieldName, OldFieldValue, NewFieldValue) 
                        VALUES(FieldName, OldValue,NewValue)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在触发器中查找多个更新的列

来自分类Dev

更新MySQL中的特定列后触发触发器

来自分类Dev

用触发器更新多个表

来自分类Dev

在postgres更新触发器中检测列更改

来自分类Dev

更新触发器中的多行更新

来自分类Dev

在oracle中查找表单的触发器

来自分类Dev

Aurelia中的多个触发器

来自分类Dev

Aurelia中的多个触发器

来自分类Dev

在触发器中更新表失败

来自分类Dev

更新SQL中的触发器

来自分类Dev

在MySQL中创建触发器并更新

来自分类Dev

更新触发器不更新列中的时间戳(更新操作)

来自分类Dev

更新列中的值并让触发器根据值更新另一列

来自分类Dev

在更新触发器之前,每次更新的更新列

来自分类Dev

创建MySQL触发器以更新另一个表中的多个记录

来自分类Dev

在Oracle触发器中运行多个插入和更新语句

来自分类Dev

更新触发器未在plpgsql中触发

来自分类Dev

更新触发器未在plpgsql中触发

来自分类Dev

如何在触发器中放置多个更新?

来自分类Dev

SQL更新触发器无法处理多个条目

来自分类Dev

在Postgresql中的BEFORE INSERT触发器中更改多个列的值

来自分类Dev

如何确定更新触发器中要更新的字段

来自分类Dev

更新更新触发器中的其他行

来自分类Dev

在 PL/SQL 触发器中查找 JSON 数组的长度

来自分类Dev

MYSQL多个触发器

来自分类Dev

更改更新触发器以在 MySQL 中插入触发器

来自分类Dev

PL / pgSQL:更新触发器中N列的一般方法?

来自分类Dev

使用触发器postgresql /从插入查询中获取值更新列值

来自分类Dev

PL / pgSQL:更新触发器中N列的一般方法?