Sql Server触发器记录字段值更新原创
金蝶云社区-angen
angen
38人赞赏了该文章 1,066次浏览 未经作者许可,禁止转载编辑于2023年10月19日 10:31:44

    经常碰到客户提单说有某些字段数据异常,特别是一些反写字段,一般来讲仅通过上机操作日志很难定位到字段异常的原因,尤其是有数据库层面对字段的修复,则更难定位,此时触发器就可以派上用场,即使是后台数据库修改字段值也可以记录到日志。通过使用触发器记录字段更新日志,并结合上机操作日志和其它辅助工具(比如反写日志,业务数据日志)可以更容易的分析字段异常问题。本帖子以跟踪销售订单分录中的辅助属性字段为例写个触发器记录日志,客户可参考本帖子应用到其它单据上的某些字段。要注意的是星空公有云不支持创建触发器,私有云也不建议使用触发器去更新字段,私有云的客户使用触发器仅记录相关日志是没有问题的,创建触发器记录字段修改日志到特定表脚本如下:

-- 创建日志表,用于记录销售订单辅助属性新值,旧值
--DROP TABLE SO_AUX_LOG
CREATE TABLE SO_AUX_LOG (FENTRYID INT, OLD_AUX INT, NEW_AUX INT, UP_DATE DATETIME, UP_TYPE NVARCHAR(200));


--删除触发器(如果存在的话)
GO
IF OBJECT_ID('LOG_AUX') <> 0 
BEGIN 
    DROP TRIGGER LOG_AUX;
END


-- 创建触发器
GO
CREATE TRIGGER LOG_AUX 
ON T_SAL_ORDERENTRY 
FOR INSERT, UPDATE, DELETE
AS
    IF UPDATE(FAUXPROPID)  --字段更新添加
    BEGIN
        INSERT INTO SO_AUX_LOG 
        SELECT A.FENTRYID, B.FAUXPROPID, A.FAUXPROPID, GETDATE(), 'UPDATE\INSERT' 
        FROM INSERTED A 
        LEFT JOIN DELETED B ON A.FENTRYID = B.FENTRYID;
    END;
     
     IF EXISTS(SELECT 1 FROM DELETED) AND NOT EXISTS (SELECT 1 FROM INSERTED) --字段删除
     BEGIN
        INSERT INTO SO_AUX_LOG 
        SELECT A.FENTRYID, A.FAUXPROPID, B.FAUXPROPID, GETDATE(), 'DELETE' 
        FROM DELETED A 
        LEFT JOIN INSERTED B ON A.FENTRYID = B.FENTRYID 
        WHERE B.FENTRYID IS NULL AND A.FAUXPROPID <> 0;
    END;


    创建一张销售订单,录入相关辅助属性,而后修改下辅助属性,再删除相关单据,如下图1-1所示:

image.png

图1-1


    辅助属性字段修改日志表查询结果如下图1-2所示:

image.png

图1-2

图标赞 38
38人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!

您的鼓励与嘉奖将成为创作者们前进的动力,如果觉得本文还不错,可以给予作者创作打赏哦!

请选择打赏金币数 *

10金币20金币30金币40金币50金币60金币
可用金币: 0