日志类触发器

本文介绍了日志类触发器的概念,用于记录数据库的INSERT, UPDATE, DELETE操作,便于日后查阅。触发器创建了一个日志表,记录操作时间、SQL语句、操作者信息等。内容包括如何获取客户端IP、执行的SQL语句,以及不同类型的日志记录方式。还提供了测试示例和触发器的完整代码,帮助理解如何实现日志跟踪。" 104145886,5599742,3D人脸重建与分析数据集大全,"['人工智能', '3D建模', '计算机视觉', '面部识别', '数据集']
 

触发器综述之二

 

日志类触发器

   

简单的说,日志类触发器的功能是记录对表的操作,也就是尽量全面地反映数据库表所进行的INSERT,UPDATE,DELETE操作,便于日后翻阅。

从功能上来说,一般此类触发器往往会建立一个日志表,用来记录操作的过程,往往需要记录操作者信息,比如SQL登陆用户、客户端的机器名、客户端的IPOS登陆用户、所用的应用程序等。也需要记录操作时间、执行的SQL语句以及操作所影响的记录,对操作记录的记录,可以分为两类,一类是只记录操作类型和影响的行数,其中操作类型分为增加、删除和修改;另一类是详细记录插入后、修改前、修改后、删除前的记录,这种触发器在一次操作多条记录的时候会记录多条记录,修改的时候会产生两倍日志记录,记录更佳详细,但是对性能的影响也会大些。

从技术上来说,这类触发器最简单,因为不管是记录操作类别还是记录改前、删前数据,触发器都只需做插入操作,但是需要记录的信息的得到有些是有点难度的,特别是客户端的IP和执行的SQL语句。

《一个用于跟踪和发现程序错误的触发器》是我之前贴出的一个触发器,用调用'DBCC INPUTBUFFER的方法记录了SQL语句,使用了临时表,有点影响速度。但没有记录影响行数和操作分类,今天贴一个全的,并贴出测试过程。客户端的IP的取得之前有过用XP_CMDSHELL调用PING的,但是这个方法与操作系统有关,有时测不到,而且对性能也有影响,所以就不检测了。

 

--建立日志表  

  CREATE   TABLE   TBLOG(  

  ID   INT   NOT   NULL   IDENTITY(1,1),  

  EVTIME   DATETIME   NOT   NULL   DEFAULT   (GETDATE()),                           --访问时间  

  SQL   VARCHAR(300),                                                --执行的SQL语句  

  USERID   VARCHAR(128)   NOT   NULL   DEFAULT   (SUSER_SNAME()),                  --连接的时候使用的哪个SQL登陆用户        

  HOSTNAME   VARCHAR(128)   NOT   NULL   DEFAULT   (HOST_NAME()),                       --客户端的机器名                           

  LOGINID   VARCHAR(128),                                                  --客户端的登陆用户(OS的用户)  

  APPNAME   VARCHAR(128)   NOT   NULL   DEFAULT(APP_NAME()),          --是从查询分析器,还是应用程序来执行的                

  OPTYPE   INT,                                                                                                      --执行的是INSERT,UPDATE,还是DELETE操作            

  ROWCNT   INT                                                                                                            --影响了多少行数据                                            

  )  

  GO  

   

--测试表  

  CREATE   TABLE   TBTEST(  

  A   INT,  

  B   VARCHAR(10)  

  )  

  GO  

   

  --触发器  

  CREATE   TRIGGER   TR_TBTEST   ON   TBTEST  

  FOR   INSERT,DELETE,UPDATE  

  AS  

   

  --ROWCNT  

  DECLARE   @ROWS   INT  

  SET   @ROWS=@@ROWCOUNT  

   

  SET   NOCOUNT   ON  

   

  --SQL  

MyBatis本身并不直接提供事务日志的解析功能,也不支持设置触发器来响应日志中的事件。然而,可以通过集成其他组件或利用MyBatis提供的扩展点来实现似的功能。以下是一些可能的方法和建议: ### 1. 使用MyBatis拦截器(Interceptor) MyBatis允许通过拦截器来拦截和处理SQL执行过程中的某些操作,比如执行查询、更新等。可以利用这一特性来记录事务相关的日志信息,并在特定条件下触发某些动作。 #### 示例代码:创建一个简单的日志拦截器 ```java @Intercepts({@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}), @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})}) public class TransactionLogInterceptor implements Interceptor { @Override public Object intercept(Invocation invocation) throws Throwable { // 在执行SQL前的操作 System.out.println("Before executing SQL: " + invocation.getMethod().getName()); // 执行原始方法 Object result = invocation.proceed(); // 在执行SQL后的操作 System.out.println("After executing SQL: " + invocation.getMethod().getName()); return result; } @Override public Object plugin(Object target) { return Plugin.wrap(target, this); } @Override public void setProperties(Properties properties) { // 可以在这里读取配置文件中的属性 } } ``` #### 配置拦截器 在`mybatis-config.xml`中添加拦截器: ```xml <plugins> <plugin interceptor="com.example.TransactionLogInterceptor"> <!-- 可以在这里添加配置参数 --> </plugin> </plugins> ``` ### 2. 利用Spring AOP进行事务管理 如果项目中使用了Spring框架,可以结合Spring AOP来实现更复杂的事务日志记录和触发机制。Spring AOP可以在方法调用前后插入切面逻辑,从而实现日志记录、性能监控等功能。 #### 示例代码:使用Spring AOP记录事务日志 ```java @Aspect @Component public class TransactionAspect { @Autowired private TransactionLogService transactionLogService; @AfterReturning("execution(* com.example.service.*.*(..))") public void logTransaction(JoinPoint joinPoint) { // 获取方法名和参数 String methodName = joinPoint.getSignature().getName(); Object[] args = joinPoint.getArgs(); // 记录日志 transactionLogService.log(methodName, args); } } ``` ### 3. 使用数据库触发器 除了在应用层面对事务进行监控外,还可以直接在数据库层面设置触发器。数据库触发器可以在特定的数据库操作(如INSERT、UPDATE、DELETE)发生时自动执行预定义的动作。 #### 示例代码:创建一个简单的触发器 假设有一个表`users`,我们希望在每次插入新用户时记录日志。 ```sql CREATE TRIGGER after_user_insert AFTER INSERT ON users FOR EACH ROW BEGIN INSERT INTO user_logs (user_id, action, timestamp) VALUES (NEW.id, 'insert', NOW()); END; ``` ### 4. 结合日志框架进行日志分析 可以使用日志框架(如Log4j、SLF4J等)将事务相关的日志输出到文件或其他存储介质,然后通过日志分析工具(如ELK Stack、Graylog等)对日志进行实时分析,并在满足条件时触发警报或执行其他操作。 #### 示例配置:Log4j配置文件 ```xml <configuration> <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <pattern>%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p %c{1}:%L - %m%n</pattern> </layout> </appender> <logger name="com.example"> <level value="DEBUG"/> </logger> <root> <priority value="INFO"/> <appender-ref ref="STDOUT"/> </root> </configuration> ``` ### 总结 通过上述方法,可以有效地解析MyBatis事务日志并设置触发器。具体选择哪种方法取决于项目的实际需求和技术栈。如果需要更复杂的日志处理功能,建议结合多种技术手段共同实现。 ---
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值