zoukankan      html  css  js  c++  java
  • 在SQLServer里面追寻触发器触发的源头

    通常,数据库的数据的都是程序发送的指令进行增删改。后台进行日常维护包括备份、索引重建等工作,当然也存在直接执行update语句以修复错误数据的情况,如果这种行为发生在客户身上,并且客户是个二把刀,那么可能会出后果无人承担的情况。那么除了从制度上明确上述行为之外,技术上能否进行一些追踪呢?

    我们可以通过下面语句获取到当前正在执行的语句:

    DECLARE @Handle varbinary(64);
    SELECT @Handle = sql_handle 
      FROM master..sysprocesses
     WHERE spid=@@SPID
    
    SELECT * FROM sys.fn_get_sql(@Handle);  
    GO

    即根据SQLServer全局变量@@spid就可以获取到当前执行的是哪个语句。这与从“活动监视器”里面取进程的批处理命令是一个原理。

    回到主题,如果要监控数据变化,我们就得在触发器里面安插自己的监控,从而记录事件发生的时间地点人物,事情的起因经过结果。

    那么在触发器里面上面这句是否有效呢,答案是否定的。

    下面祭出大招:

    CREATE TABLE #inputbuffer(
          EventType nvarchar(30), 
          Parameters smallint, 
          EventInfo nvarchar(4000)    
    )
    
    insert into #inputbuffer
    exec('dbcc INPUTBUFFER( @@SPID )')

    关键在于这句,获取触发当前spid的语句,返回三个字段。如果是由存储过程触发的,则返回存储过程名

    取到原始语句后,我们就可以判断数据变化到底是由那个语句触发,为我们进一步判断罪魁祸首提供依据。

    当前了,这种行为都是事后诸葛,而且会损失一部分数据库性能。

    如要从根源上有效预防这种情况还是要从制度上去分清楚权利和责任。

  • 相关阅读:
    create-react-app
    简单的PHP的任务队列
    Yii框架中使用PHPExcel导出Excel文件
    Android 使用全局变量的问题
    Android 退出整个应用程序
    new DialogInterface.OnClickListener()报错的解决办法
    Yii 日期时间过滤列 filter
    Yii 时间戳格式化显示的问题
    PullToRefreshListView 应用讲解
    Android:Layout_weight的深刻理解
  • 原文地址:https://www.cnblogs.com/blogzhang/p/6062371.html
Copyright © 2011-2022 走看看