Как вы можете увидеть, что вносит изменения в базу данных SQL Server? - PullRequest
0 голосов
/ 03 октября 2018

Я ищу лучший способ выяснить, какая программа, хранимая процедура или пользователь вносит изменения в базу данных SQL Server.

1 Ответ

0 голосов
/ 03 октября 2018

Мне удалось решить эту проблему с помощью триггеров SQL (Этого также можно достичь с помощью Аудит SQL Server .)

Внимание!Не используйте, не полностью понимая, что все здесь делает, иначе система будет отключена!Перед развертыванием тщательно протестируйте промежуточную среду!

Этот инструмент наиболее полезен для поиска источника изменений в таблице (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;
*/

Источник

...