您如何查看正在对SQL Server数据库进行更改的内容?

时间:2018-10-02 21:26:12

标签: sql-server wiki database-trigger

我正在寻找找出哪种程序,存储过程或用户对SQL Server数据库进行更改的最佳方法。

1 个答案:

答案 0 :(得分:-2)

我设法通过使用SQL触发器(这也可以通过SQL Server Audit实现)来解决。

警告!在不完全了解这里所有功能的情况下不要使用,否则会导致系统崩溃!部署之前,请在暂存环境中进行全面测试!

此工具对于查找表更改源(dll,存储过程等)最有用。 SQL Profiler在此方面的功能非常有限,因此获取此信息的最佳方法是创建一个触发器并将该信息记录到表中。

STEPS:

  1. 创建一个表,用于存储触发器的结果

  2. 创建一个触发器来记录导致更改的事件

  3. 创建一个清理旧记录的计划作业,以保持较小的表大小

  4. 完成对问题的调查后,清理所有内容

注意:您可能必须更改作业的用户才能使其具有运行权限。

--1. SQL Server log table
USE MySQLDatabase; --Search and replace all cases of the database name before use
CREATE TABLE SQLLog 
(
    language_event NVARCHAR(100),
    parameters INT,
    event_info NVARCHAR(4000),
    event_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
GO

--2. Trigger to monitor Session Update
CREATE TRIGGER LogMySQL
ON tblName --Trigger will be placed on this table
AFTER UPDATE--, INSERT, DELETE --(you can add records if you also want to see insert or deletes happening)
AS 
     INSERT INTO SQLLog (language_event, parameters, event_info)
        EXEC('DBCC INPUTBUFFER(@@SPID);');
GO

--3. Job that clears all records from the table that are more than 7 days old
USE msdb;
GO
EXEC dbo.sp_add_job
    @job_name = N'Run SQLLogClean' ;
GO
EXEC sp_add_jobstep
    @job_name = N'Run SQLLogClean',
    @step_name = N'Delete all old records from SQLLogClean',
    @subsystem = N'TSQL',
    --@command is the query that will get executed by the job. 7 is the age in days of rows you want to delete
    @command = N'USE MySQLDatabase delete from SQLLog where event_time < (getdate() - 7)',
    @retry_attempts = 5,
    @retry_interval = 5 ;
GO
--Schedule to run daily at 04:00
EXEC dbo.sp_add_schedule
    @schedule_name = N'RunDaily',
    @freq_type = 4, -- Value of 4 means Daily
    @freq_interval = 4,
    @active_start_time = 040000 ; --Start time for job. Format is HHMMSS
GO
EXEC sp_attach_schedule
   @job_name = N'Run SQLLogClean',
   @schedule_name = N'RunDaily';
GO
EXEC dbo.sp_add_jobserver
    @job_name = N'Run SQLLogClean';
GO

--4. Cleanup once all has finished
/*
USE msdb;
IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'Run SQLLogClean')
EXEC msdb.dbo.sp_delete_job @job_name=N'Run SQLLogClean', @delete_unused_schedule=1
GO

USE MySQLDatabase;
DROP TABLE SQLLog;
DROP TRIGGER LogMySQL;
*/

Source