【问题标题】:How can you see what is making changes to an SQL Server database?如何查看对 SQL Server 数据库进行更改的内容?
【发布时间】:2018-10-02 21:26:12
【问题描述】:

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

【问题讨论】:

  • 为什么要标记这个 Wiki?我似乎根本与 Wiki 无关。

标签: sql-server triggers wiki


【解决方案1】:

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

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

步骤:

  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

【讨论】:

  • 你曾经使用过大型数据库吗?
  • 这应该主要用作诊断工具,它的设计并未考虑到长时间使用。但是,由于您可以指定要在哪个表上运行以及导致它记录的语句类型,因此如果您有策略地使用它,您不太可能会导致大量开销。
猜你喜欢
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-05
  • 2011-08-25
  • 1970-01-01
相关资源
最近更新 更多