.net+mssqlserver2005环境,数据库中有20多张表,但就这一个表出问题。IIS日志上没有被SQL注入的痕迹,SQL端口防火墙只对WEB服务器开放,怀疑有两种可能:
1、程序BUG。
程序中有地方对该表有操作,在非常特殊的条件下触发,UPDATE或DELETE事件,但是在整个项目中查找表名关键字,未果。
存储过程中也没有类似操作。可能性基本排除。2、公司内部有人登录服务器进行操作。
目前来看,虽然没有动机,但这种可能性最大,我想针对该表进行监控,如果数据发生变化时,记录客户端消息,如时间、应用程序、客户端IP等,但是找不到办法。我尝试在触发器中查询系统表[活动监视器],但在after操作之后,系统表中已经查不到相关操作,请问有什么办法吗?

解决方案 »

  1.   

    可以通过创建审计来监视具体表的操作,select,insert,delete都可以
    给你个例子USE master
    CREATE SERVER AUDIT testAudit TO FILE(FILEPATH='D:\TempSelectAudit\')
    GO
    CREATE DATABASE AUDIT SPECIFICATION testAudSpec FOR SERVER AUDIT testAudit
    ADD (SELECT ON HumanResources.Employee BY Public)
    GO
    USE master
    SELECT is_state_enabled,* FROM sys.server_file_audits
    USE AdventureWorks
    SELECT is_state_enabled,* FROM sys.database_audit_specifications
    GO
    USE master
    ALTER SERVER AUDIT testAudit WITH (STATE=ON)
    GO
    USE AdventureWorks
    ALTER DATABASE AUDIT SPECIFICATION testAudSpec WITH (STATE=ON)
    GO
    SELECT session_server_principal_name, statement, *
    FROM fn_get_audit_file ('D:\TempSelectAudit\*',NULL, NULL)
      

  2.   

    实在不行,你修改下程序,所有的update和delete操作同时生成一条具体的操作记录,添加到一张新的系统日志表里,包括登录帐号、登录的IP地址、MAC地址等等。
      

  3.   

    如果是持续发生的,可以用profile看看
      

  4.   

    我新开了个审计之后,发现SQL运行了这么一条语句:SET ROWCOUNT 0 
    SET TEXTSIZE 2147483647 
    SET NOCOUNT OFF 
    SET CONCAT_NULL_YIELDS_NULL ON 
    SET ARITHABORT ON 
    SET LOCK_TIMEOUT -1 
    SET QUERY_GOVERNOR_COST_LIMIT 0 
    SET DEADLOCK_PRIORITY NORMAL 
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED 
    SET ANSI_NULLS ON 
    SET ANSI_NULL_DFLT_ON ON 
    SET ANSI_PADDING ON 
    SET ANSI_WARNINGS ON 
    SET CURSOR_CLOSE_ON_COMMIT OFF 
    SET IMPLICIT_TRANSACTIONS OFF 
    SET QUOTED_IDENTIFIER ON不是刚开始审计的时候,是审计已经开了几天,监控到的几万条语句其中之一,
    它在干什么呢?