Реализация простого аудита с помощью триггеров

ПУБЛИКАЦИИ  

По материалам статьи Robert Marda на sqlservercentral.com: Auditing Through Triggers

В этой статье Роберт приводит примеры кода для нескольких триггеров, устанавливаемых на таблицы в целях аудита действий пользователей с записями MS SQL Server 7.0/2000.

Для пояснения работы триггеров вообще и как они работают в SQL Server 7.0 и SQL Server 2000, Вы можете обратиться к следующим статьям, написанным Брайеном Келлей (Brian Kelley):

Triggers in SQL Server 7.0 and 2000 - The Common Ground
Triggers in SQL Server 7.0 and 2000 - What's New

Первая статья объясняет назначение специальных таблиц для вставки и удаления (inserted and deleted Tables).
Предлагаемые ниже примеры будут работать на SQL Server 2000, однако они были проверены только на SQL Server 7.0.
Сначала мы должны создать необходимые для дальнейшей работы таблицы. Выполните представленный ниже скрипт в Query Analyzer:


CREATE TABLE [Components] (
[Iden] [int] IDENTITY (1, 1) NOT NULL ,
[ComponentName] [varchar] (25) NULL ,
[SerialNumber] [varchar] (25) NULL ,
[Comments] [varchar] (75) NULL ,
[UserName] [varchar] (50) NULL ,
[UpdateDate] [datetime] NULL ,
[UpdatedBy] [varchar] (35) NULL
) ON [PRIMARY]
GO

CREATE TABLE [ComponentsDeleted] (
[Iden] [int] NOT NULL ,
[ComponentName] [varchar] (25) NULL ,
[SerialNumber] [varchar] (25) NULL ,
[Comments] [varchar] (75) NULL ,
[UserName] [varchar] (50) NULL ,
[DeletedDate] [datetime] NULL ,
[DeletedBy] [varchar] (35) NULL ,
) ON [PRIMARY]
GO

Триггер, отслеживающий операции Insert/Update

Один из самых простых способов применения триггера, это когда он срабатывает всякий раз, когда в таблице модифицируется любой столбец или всякий раз, когда вставляется строка. Следующий скрипт может быть выполнен в Query Analyzer для создания триггера, который фиксирует время, когда строка была вставлена или модифицирована и имя пользователя, который сделал это изменение:


CREATE TRIGGER updatedby ON dbo.Components
FOR INSERT, UPDATE
AS
UPDATE c SET UpdateDate = getdate(), UpdatedBy = SYSTEM_USER
FROM inserted i
INNER JOIN dbo.Components c ON i.Iden = c.Iden

Для проверки работы триггера вставьте несколько строк в таблицу Components и затем внесите изменения в одну или две строки.
Теперь предположим, что нам нужно знать только то, когда компонент был изменён. Изменение в серийном номере могло бы являться указанием на то, что внесено отслеживаемое изменение. Вы можете внести изменения в предложенный выше триггер (используя команду ALTER TRIGGER) чтобы он срабатывал только тогда, когда столбец SerialNumber будет изменён. Для этого можно выполнить этот скрипт:


ALTER TRIGGER updatedby ON dbo.Components
FOR INSERT, UPDATE
AS

IF UPDATE(SerialNumber)
BEGIN

UPDATE c SET UpdateDate = getdate(), UpdatedBy = SYSTEM_USER
FROM inserted i
INNER JOIN dbo.Components c ON i.Iden = c.Iden

END

Проверьте работу изменённого триггера, изменив значения в столбце Comments, затем в столбце SerialNumber.

Триггер, отслеживающий операции удаления

Если Вы хотите фиксировать удаления из таблицы, можете воспользоваться примером триггера, который будет вставлять строку в ComponentsDeleted всякий раз, когда строка будет удалена из таблицы

Components:


CREATE TRIGGER deletedby ON dbo.Components
FOR DELETE
AS
INSERT INTO ComponentsDeleted (Iden, ComponentName, SerialNumber,
Comments,
UserName, DeletedDate, DeletedBy)
SELECT Iden, ComponentName, SerialNumber, Comments, UserName, getdate(),
SYSTEM_USER
FROM deleted

Удалите одну или две строки из таблицы Components. Теперь посмотрите таблицу ComponentsDeleted, и Вы увидите там удаленные Вами строки с датой и временем того, когда они были удалены.

Установка простой системы аудита, использующей триггеры, примеры которых представлены в этой статье, может быть полезной в тех случаях, когда Вам необходимо знать, кто и когда выполнил отслеживаемые триггерами действия в вашей базе данных.


Перевод: Александра Гладченко  2002г.

ПУБЛИКАЦИИ

Скачать электронную карту Ангарска бесплатно
Сайт управляется системой uCoz