SQL Server触发器记录销售订单物流单号字段的值更新日志(带语句脚本)原创
金蝶云社区-angen
angen
1人赞赏了该文章 74次浏览 未经作者许可,禁止转载编辑于2024年11月01日 13:55:22

    有些特殊字段如果想跟踪何时修改成什么值,以及想跟踪由什么语句触发更新的,可以参照本论坛类似地处理。注:本帖子是由触发器记录的日志,目前公有云客户应该是不能创建触发器的。

--创建日志表
CREATE TABLE SO_TRACE 
(
    ID INT IDENTITY(1,1), 
    FENTRYID INT, 
    OLD_CARRYBILLNO NVARCHAR(4000),
    NEW_CARRYBILLNO NVARCHAR(4000),
    UP_DATE DATETIME,
    UP_TYPE NVARCHAR(200),
    UP_SQL VARCHAR(8000)
);

--创建触发器
IF OBJECT_ID('TR_LOG_TRACE') <> 0 
    DROP TRIGGER TR_LOG_TRACE;
GO
CREATE TRIGGER TR_LOG_TRACE 
ON T_SAL_ORDERTRACE
FOR INSERT, UPDATE, DELETE
AS
    --DBCC INPUTBUFFER EventInfo字段,只取事件前4000字符
    DECLARE @STR01 AS VARCHAR(255)
    DECLARE @STR_SQL AS VARCHAR(8000)
    CREATE TABLE #SQL_CONTENT
    (
        C_EventType VARCHAR(255),
        C_Parameters VARCHAR(255),
        C_EventInfo VARCHAR(8000)
    );
    SET @STR01 = 'DBCC INPUTBUFFER(' + CAST(@@SPID AS VARCHAR(50)) + ')'
    INSERT INTO #SQL_CONTENT EXEC(@STR01)
    SELECT @STR_SQL = C_EventInfo FROM #SQL_CONTENT;
    IF UPDATE(FCARRYBILLNO)
    BEGIN
        INSERT INTO SO_TRACE(FENTRYID, OLD_CARRYBILLNO, NEW_CARRYBILLNO, UP_DATE, UP_TYPE, UP_SQL) 
        SELECT A.FENTRYID, B.FCARRYBILLNO, A.FCARRYBILLNO, GETDATE(), 'UPDATE\INSERT', @STR_SQL 
        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_TRACE(FENTRYID, OLD_CARRYBILLNO, NEW_CARRYBILLNO, UP_DATE, UP_TYPE, UP_SQL) 
        SELECT A.FENTRYID, A.FCARRYBILLNO, B.FCARRYBILLNO, GETDATE(), 'DELETE', @STR_SQL 
        FROM DELETED A 
        LEFT JOIN INSERTED B ON A.FENTRYID = B.FENTRYID 
        WHERE B.FENTRYID IS NULL;
    END;
GO


    销售订单保存时如果输入物流单号,则会出现一条带INSERT INTO T_SAL_ORDERTRACE的语句,如果是下推出库单,在出库单中保存另一个物流单号且快递100参数配置中勾选了'出库单保存回填上游通知单、订单物流单号和公司'参数,则会出现一条MERGE INTO T_SAL_ORDERTRACE的语句,如下图1-1所示:

image.png

图1-1


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