• sql server 保存错误信息到日志表


    建表

    CREATE TABLE ErrorLog(
        [ErrorLogID] [int] IDENTITY(1,1) NOT NULL,
        [ErrorTime] [datetime] NULL,
        [UserName] [sysname] NULL,
        [ErrorNumber] [int] NULL,
        [ErrorSeverity] [int] NULL,
        [ErrorState] [int] NULL,
        [ErrorProcedure] [nvarchar](126) NULL,
        [ErrorLine] [int] NULL,
        [ErrorMessage] [nvarchar](4000) NULL,
     CONSTRAINT [PK_ERRORLOG] PRIMARY KEY CLUSTERED 
    (
        [ErrorLogID] 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 TABLE [dbo].[ErrorLog] ADD  DEFAULT (getdate()) FOR [ErrorTime]
    GO

    存储过程

    create procedure pro_ErrorLog
    AS                               
    BEGIN
        SET NOCOUNT ON;
    
            INSERT INTO [dbo].[ErrorLog]
                (
                [UserName],
                [ErrorNumber],
                [ErrorSeverity],
                [ErrorState],
                [ErrorProcedure],
                [ErrorLine],
                [ErrorMessage]
                )
            VALUES
                (
                CONVERT(sysname, CURRENT_USER),--current_user ,这里值是dbo,dbo是每个数据库的默认用户,具有所有者权限
                                               --sysname类型 用于表列、变量以及用于存储对象名的存储过程参数,等价与nvachart(120)
                ERROR_NUMBER(),                 --错误代号,有很多错误代号,可以自行百度
                ERROR_SEVERITY(),               --错误的严重性
                ERROR_STATE(),                  --错误的状态码
                ERROR_PROCEDURE(),              --错误的存储过程
                ERROR_LINE(),                   --错误行号
                ERROR_MESSAGE()                 --错误信息
                );
           
            --execute dbo.pro_PrintError;--改存储过程会将ERROR_MESSAGE()在sql server信息窗口打印出来
    END

    exec pro_ErrorLog

    调用  在catch中执行这个存储过程,回滚会插入失败,要注意。

    我们公司目前的项目无法调用这个存储过程,只能采用在 catch 中每行单个赋值,然后在事务完成以后进行插入到日志表里。

    --声明
    declare @errorMsg varchar(4000) = ''
    declare @errorNumber int 
    declare @errorSeverity int
    declare @errorState int
    declare @errorLine int
    declare @errorProcedure varchar(126)
    
    
    --catch中赋值
    set @errorMsg = ERROR_MESSAGE()
    set @errorNumber = ERROR_NUMBER()
    set @errorSeverity = ERROR_SEVERITY()
    set @errorState = ERROR_STATE()
    set @errorLine = ERROR_LINE()
    set @errorProcedure = ERROR_PROCEDURE()
    
    
    --插入日志表,注意要判断有内容的时候才做插入
    if @errorProcedure is not null
    INSERT INTO [dbo].[ErrorLog]
    (
        [UserName],
        [ErrorNumber],
        [ErrorSeverity],
        [ErrorState],
        [ErrorProcedure],
        [ErrorLine],
        [ErrorMessage]
    )
        VALUES
    (
        CONVERT(sysname, CURRENT_USER),--current_user ,这里值是dbo,dbo是每个数据库的默认用户,具有所有者权限
        @errorNumber,                 --错误代号,有很多错误代号,可以自行百度
        @errorSeverity,               --错误的严重性
        @errorState,                  --错误的状态码
        @errorProcedure,              --错误的存储过程
        @errorLine,                   --错误行号
        @errorMsg                 --错误信息
    );
  • 相关阅读:
    MVC三层架构
    Cookie
    request (请求转发)
    response 重定向
    HttpServletResponse(响应),实现文件下载,实现验证码功能
    HTTP报文格式
    基于UUID生成短ID
    一致性hash应用到redis
    spring-mysqlclient开源了
    Effection Go
  • 原文地址:https://www.cnblogs.com/Transmuter/p/15498844.html
Copyright © 2020-2023  润新知